Punkt 1:
Ersetze den " in (Select ...)" durch einen exists (select * ...).
Begründung:
der "in ()" wird je Quellzeile ausgeführt und liest alle Zeilen der Whereklausel, der Exists wird auch je Zeile ausgeführt, versucht aber über Index nach Möglichkeit nur 1 Zugriff.
Punkt 2:
Betrachte deinen in (select..)
Da deine Where-Klausel nur die Tabelle T2 benötig dreh den Join u.U. einfach um.Code:IN (SELECT T1.OHDISC FROM spefil.OHTRNP AS T1 INNER JOIN spefil.CDTRNP AS T2 ON T1.OHSODN = T2.CDSODN AND T1.OHODCC = T2.CDODCC AND T1.OHODYY = T2.CDODYY AND T1.OHODMM = T2.CDODMM AND T1.OHODDD = T2.CDODDD WHERE (T2.CDCHID = CH.CHID OR (CH.CHBAID > 0 AND T2.CDCHID = CH.CHBAID)))))
Du könnteste zusätzlich statt einem "in Select" 2x Exists-Select verwenden.
Punkt 3:
STRSQL und ACS-SQL optimieren für die schnelle Erstanzeige, da i.d.R. nicht alle Sätze des Selects angesehen werden.
Mach dann aber mal in STRSQL die Eingabe "B" um alle Zeilen zu laden, dann wirst du auch hier die schlechte Performance sehen.
Punkt 4:
Manchmal macht es Sinn, die Felder der Gesamt-Where-Klausel an den Anfang zu stellen gefolgt von den Exists-Select.
Punkt 5:
Nur für die Lesbarkeit lege den Exists-Subselect mal separat in eine CTE, dann wird der SQL übersichtlicher.
Punkt 6:
*SORTEDPTL deutet auf eine intern erstellte sortierte Tabelle hin, die vorab ja erst mal aufgebaut werden muss. Wenn man sich diese sparen kann, zu mal du ja keinen Order By hast, ist schon viel gewonnen.
![[NEWSboard IBMi Forum]](images/duke/nblogo.gif)



Mit Zitat antworten
Bookmarks