Was ist der andere beste Ansatz von der Entwicklerseite, um die Zeit zu verkürzen?
#1.
Ausführungszeit = 08 Sekunden
select COUNT(A.CORRESP_NO) —COUNT(DISTINCT A.CORRESP_NO)
von CORIC IC
innerer Join CORCUS A ON (A.CORSNO = IC.CORSSNO)
innerer Join OTHTAB ot
auf a.CORCUSLAN =ot.OTHK98
#2.
Ausführungszeit = 53 Sekunden
wähle COUNT(DISTINCT A.CORRESP_NO)
von CORIC IC
innerer Join CORCUS A ON (A.CORSNO = IC.CORSSNO)
innerer Join OTHTAB ot
auf a.CORCUSLAN =ot.OTHK98
ich vermute, der Optimizer tappt im 2. Statement in die Falle mit der “driving table”, die nicht das Object enthält, das gezählt wird.
Es riecht so, als ob der Optimizer die falsche Reihenfolge wählt, erst macht er einen vermutlich riesigen Join, im Ergebnis davon zählt er die einzigartigen Vorkommen von A.CORRESP_NO.
Man muss das Statement so umstellen, dass das Zwischenergebnis direkt so klein wie möglich ist. Da es im Beitrag kein Explain gibt bzw. keine Mengengerüste genannt wurden, kann man nicht konkret antworten.
Da die erste Abfrage viel schneller ist, ist die Lösung jedenfalls nicht zwangsläufig, einen zusätzlichen Index anzulegen.