View Full Version : Verknüpfen von Tabellen mit SQL
Hallo Forum,
ich habe da ein generelles Problem mit Tabellenverknüpfungen per SQL.
Ich habe 2 Tabellen die beide ein Schlüsselfeld Auftragsnummer und ein Schlüsselfeld Auftragsposition haben.
D.h. der Key in der DDS Beschreibung der Dateien ist Auftragsnummer/Auftragsposition UNIQUE
.
Wenn ich nun die beiden Tabellen mit Select * From Tabelle1 T1 Left Outer Join Tabelle2 T2 ON T1.Nr = T2.Nr AND T1.Pos = T2.Pos
verknüpfe dauert die Ausführung des SQL's sehr lange.
Kennt jemand eine Möglichkeit die Tabellen so zu verknüpfen das die Ausführung des SQL's schneller geht.
Es ist vielleicht noch zu erwähnen das in Tabelle1 eher wenige Sätze und in Tabelle2 sehr viele Sätze sind.
Vielen Dank für die Hilfe.
Lege über beide TAbellen einen Index mit NR und POS an. Dieser fehlt hier anscheinend.
Sind beide Keyfelder jeweils die ersten im Key?
Sonst wäre der Vorschlag von Fuerchau sicher zielführend.
Werden sehr viele Sätze sequentiell durchgelesen?
Da ist Embedded-SQL sicher langsamer als eine Lösung mit OPNQRYF, ausser man programmiert geblocktes Lesen.
Eine Ausführung mit STRDBG schadet auf keinen Fall, da stehen immer interessante Hinweise im Joblog.
OPNQRYF kann nicht schneller sein als SQL, da OPNQRYF SQL nutzt.
Eh klar, und auch nur den alten Optimizer.
Ich habe nur das Lesen durch das Programm gemeint.
Bei OPNQRYF wird doch das Blocken unterstützt, oder liege ich falsch?
Genau !
Im RPG bestimmt die Öffnungsart das Blocken.
I-/O-Dateien können geblockt werden, U-Daten werden nicht geblockt.
Bei SQL wird ein statischer Cursor immer geblockt.
Blocken wird verhindert bei " update of ..."
War ich immer auf dem Holzweg?
Ich war der Meinung ein FETCH löst eine I/O Operation aus, die ich nur mit einem Mehrfach-Fetch in eine Datenstruktur umgehen kann?
lg
Unabhängig davon ob du mit einem Fetch 1 Zeile oder N Zeilen abrufst, intern wird deswegen trotzdem geblockt.
Man sieht es ganz gut über "DSPJOB->Auswahl 14" (Systemanfrage 3=>14) dass die Anzahl der Leseoperationen durchaus erheblich kleiner sein kann als die Anzahl Fetch die man macht.
Blocken ist eine automatische Systemfunktion !
Anders bei native I-O. Hier wird bei RPG zusätzlicher Code ausgeführt, der das Blocken intern übernimmt.
Dadurch kommt es ja bei O-Dateien zu "seltsamen" Datenverlusten, da ggf. der interne RPG-Puffer noch nicht ausgegeben werden konnte.
Hallo,
wobei natürlich ein geblockter Fetch in eine DS mit dim signifikant schneller ist...
mfg
Dieter Bender
Unabhängig davon ob du mit einem Fetch 1 Zeile oder N Zeilen abrufst, intern wird deswegen trotzdem geblockt.
Man sieht es ganz gut über "DSPJOB->Auswahl 14" (Systemanfrage 3=>14) dass die Anzahl der Leseoperationen durchaus erheblich kleiner sein kann als die Anzahl Fetch die man macht.
Blocken ist eine automatische Systemfunktion !
Anders bei native I-O. Hier wird bei RPG zusätzlicher Code ausgeführt, der das Blocken intern übernimmt.
Dadurch kommt es ja bei O-Dateien zu "seltsamen" Datenverlusten, da ggf. der interne RPG-Puffer noch nicht ausgegeben werden konnte.
Von der Theorie zur Praxis:
Lesen von 1.500.000 Sätzen aus einer PF mit Order auf bestehende LF.
OPNQRYF 7.000 ms
SELECT * (25 Felder) 21.000 ms
SELECT 9 Felder 19.000 ms
Mehrfachfetch ?
Für Dialogprogramme ist das natürlich nebensächlich.
lg