![]() |
Datenbank: Firebird • Version: 2.5.8 • Zugriff über: FIBPlus
Ergebnis einer StoredProc innerhalb anderer StoredProc "zwischenparken"
Hallo!
Ich habe folgenden StoredProc-Body:
Code:
Ich frage mich jetzt, wie Firebird den Ablauf realisiert. Wird für jede einzelne Zeile in Tabelle A das SELECT DISTINCT... ausgeführt? Oder wird zuerst einmalig das Ergebnis aus AndereProzedur() geholt und dann immer gegen dieses Ergebnis geprüft? Hintergrund der Frage ist die Laufzeitoptimierung. AndereProzedur() ist nicht gerade von der schnellen Sorte, würde hier aber IMMER das selbe Ergebnis liefern. Falls Firebird also dieses Ergebnis für jede Zeile neu aus AndereProzedur() holen würde, dann müsste ich deren Ergebnis "zwischenparken". Also ungefähr so:
SELECT * FROM A WHERE NOT A.FELD1 IN (SELECT DISTINCT ´ID´ FROM AndereProzedur(IrgendeinParameter));
Code:
Ich hoffe ihr versteht worauf ich hinaus will. Also eigentlich zwei Fragen: Erstens wie arbeitet Firebird diesen verschachtelten Query ab und zweitens, wie kann ich ein Unterergebnis in einer Variablen zwischenparken?
PARKPLATZ = (SELECT DISTINCT ´ID´ FROM AndereProzedur(IrgendeinParameter));
SELECT * FROM A WHERE NOT A.FELD1 IN PARKPLATZ; Grüße Cody |
AW: Ergebnis einer StoredProc innerhalb anderer StoredProc "zwischenparken"
Da Du einen Parameter da drin hast und die Proc sowieso auf sich potentiell ändernden Daten arbeitet, müsste es dauernd neu berechnet werden.
Ich weiß nicht, ob FB einen Mechnismus hat, mit dem es eine Funktionsergebnis als immutable deklarieren kann. Ansonsten ist halt Handarbeit angesagt, mit Zwischentabelle und benutzerspezifischen Ergebniseinträgen. |
AW: Ergebnis einer StoredProc innerhalb anderer StoredProc "zwischenparken"
Du könntest den Wert in einer Kontextvariable zwischenspeichern
|
AW: Ergebnis einer StoredProc innerhalb anderer StoredProc "zwischenparken"
cool, wusste nicht das Firebird das kann.
|
AW: Ergebnis einer StoredProc innerhalb anderer StoredProc "zwischenparken"
Zitat:
|
AW: Ergebnis einer StoredProc innerhalb anderer StoredProc "zwischenparken"
Ich glaube nicht, dass das geht.
Du kannst einen Wert speichern. Dazu kann man auch eine normale SP - Variable nehmen. Aber das Ergebnis eines Select' s mit mehreren Ergebniszeilen Zeilen ist IMHO nicht möglich. Man könnte für den Fall eine Temporäre Tabelle (z. B. "TMP$ID" mit FELD ID) anlegen mit den ID' s aus AndereProzedur füllen. Dann halt: SELECT * FROM A WHERE NOT A.FELD1 IN (SELECT ´ID´ FROM TMP$ID); Das wäre sicher erheblich schneller... Frank |
AW: Ergebnis einer StoredProc innerhalb anderer StoredProc "zwischenparken"
In der ursprünglichen Frage ging es um einen Wert:
SQL-Code:
Mehrere Werte/Datensätze als Temp-Table
select rdb$set_context('USER_SESSION' //oder USER_TRANSACTION, '<Name der Variable>', <Wert>) from rdb$database;
|
AW: Ergebnis einer StoredProc innerhalb anderer StoredProc "zwischenparken"
Geht denn Temptable in FB SP?
Aber es muss ja nicht temp sein, Hauptsache der Inhalt wird passend eingetragen (und gelöscht). Frage wäre auch, was insgesamt der Zweck des Statements ist. Vielleicht tut es ja schon ein View oder eine Kombi View mit Context Variable.. |
AW: Ergebnis einer StoredProc innerhalb anderer StoredProc "zwischenparken"
Wenn man Zugriff auf den Source der SP hat wäre der beste Weg das Ergebnis für ID in einer loaklen Variable zu Speichern.
SQL-Code:
Oder mal Testen, wie gut optimiert wird
...
SELECT DISTINCT ´ID´ FROM AndereProzedur(IrgendeinParameter) into :ID; SELECT * FROM A WHERE A.FELD1 <> :ID; ... |
AW: Ergebnis einer StoredProc innerhalb anderer StoredProc "zwischenparken"
Ich habe es mal mit derived table getestet.
Es sollte so:
SQL-Code:
gehen.
select a.* from tabelle a
join (select distinct 'id' from andereprozedur(irgendeinparameter)) b on b.id = a.feld1 where p2.id is null Laut Leistungsananlyse von IBExpert nur jeweils 1 Durchlauf (mit meinen Testtabellen... Frank |
AW: Ergebnis einer StoredProc innerhalb anderer StoredProc "zwischenparken"
Zitat:
|
AW: Ergebnis einer StoredProc innerhalb anderer StoredProc "zwischenparken"
Zitat:
War ja auch schon spät... Frank |
AW: Ergebnis einer StoredProc innerhalb anderer StoredProc "zwischenparken"
Zitat:
Zitat:
SQL-Code:
Ohne das ginge das mit einem Join aber so fällt mir da spontan keine Lösung ein.
... WHERE **NOT** A.FELD1 IN (SELECT DISTINCT ...
|
AW: Ergebnis einer StoredProc innerhalb anderer StoredProc "zwischenparken"
Aber da fehlt doch dann nur das "left" vorm "join"
noch mal sorry, kleines Durcheinander |
AW: Ergebnis einer StoredProc innerhalb anderer StoredProc "zwischenparken"
Zitat:
Es geht zwar mit left join, aber die Anzahl der Reads hier deutlich größer. Ich fürchte, bei NOT IN ... wird wohl eine zusätzliche Tabelle die besten Ergebnisse bringen. Frank |
AW: Ergebnis einer StoredProc innerhalb anderer StoredProc "zwischenparken"
Ein gelockertes Join Kriterium muss ja meist mehr Read produzieren. Find ich erstmal kein k.o. Kriterium. Und dabei kommt es ja dann auf die Mengengerüste beider Seiten an. Gibt es viele auszuschließende Datensätze oder andersrum ..
Ob das codehunter taugt, kann er wohl nur selbst testen. |
AW: Ergebnis einer StoredProc innerhalb anderer StoredProc "zwischenparken"
Zitat:
EDIT: Ich hänge heute irgendwie hinterher. Ihr wart immer schneller mit antworten :-) Ich hab halt auch das Gefühl, Firebird ist in manchen Dingen anderen Datenbanken wie MariaDB usw. unterlegen. Bei MariaDB kann ich mit
SQL-Code:
einen solchen Parkplatz bauen wie im Eingangspost angedacht.
CREATE TEMPORARY TABLE ´PARKPLATZ´ FOR SELECT DISTINCT ...
![]() |
AW: Ergebnis einer StoredProc innerhalb anderer StoredProc "zwischenparken"
Zitat:
Ich bin gerade schon mit den Statements (Vorlage von Dir und Anpassung von dataspider) durcheinander gekommen. Das müsste bei Dir doch schnell erledigt sein, dass Du das Gegenteil von dem was du jetzt bekommst. (Hätte ich in der Grundschule bloß besser aufgepasst) |
AW: Ergebnis einer StoredProc innerhalb anderer StoredProc "zwischenparken"
Zitat:
Es fehlt nur noch ein winziges Stück und die Antworten kommen vor dem Eröffnungspost. |
AW: Ergebnis einer StoredProc innerhalb anderer StoredProc "zwischenparken"
Zitat:
Zitat:
|
AW: Ergebnis einer StoredProc innerhalb anderer StoredProc "zwischenparken"
Zitat:
SQL-Code:
In der SP dann:
CREATE GLOBAL TEMPORARY TABLE TMP$ID (
ID PK NOT NULL) ON COMMIT PRESERVE ROWS; ALTER TABLE TMP$ID ADD CONSTRAINT PK_TMP$ID PRIMARY KEY (ID);
SQL-Code:
Das bringt aber nur viel, wenn die andereprozedur tatsächlich langsam ist.
delete from tmp$id; -- vorsichtshalber
insert into tmp$id select distinct 'id' from andereprozedur(irgendeinparameter); for select * from a where not a.feld1 in (select id from tmp$id) into.... do begin end; Um das richtig abzuschätzen, müsste man wisse, was andereprozedur macht. Wäre der Select in andereprozedur ein indexierter mit 10 Reads bei 10 Zeilen Rückgabe, dann kannst du alles lassen wie es ist. Frank |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:06 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz