PDA

View Full Version : Verknüpfen von Tabellen mit SQL



Seiten : [1] 2 3

e_sichert
23-11-06, 07:33
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.

Fuerchau
23-11-06, 18:45
Lege über beide TAbellen einen Index mit NR und POS an. Dieser fehlt hier anscheinend.

alfredo
24-11-06, 09:37
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.

Fuerchau
24-11-06, 12:33
OPNQRYF kann nicht schneller sein als SQL, da OPNQRYF SQL nutzt.

alfredo
24-11-06, 12:37
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?

Fuerchau
24-11-06, 12:59
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 ..."

alfredo
24-11-06, 16:01
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

Fuerchau
24-11-06, 16:21
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.

BenderD
24-11-06, 16:53
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.

alfredo
25-11-06, 09:46
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