Dies ist langsam:Wie Oracle-Hinweise oder andere Optimierung zu verwenden, um Funktion in Where-Klausel-Leistungsproblem zu beheben?
select col_x from table_a where col_y in (select col_y from table_b) and fn(col_x)=0;
Aber ich weiß, dass diese schnelle 4 Zeilen zurück, und dass ich schnell fn() auf 4 Werte laufen.
So mache ich einige Tests, und ich sehe, dass dies schnell:
select fn(col_x) from table_a where col_y in (select col_y from table_b);
Wenn die fn() verwendet in der where-Klausel wird Oracle es in TABLE_A auf jeder Zeile ausgeführt wird. Wie kann ich es so machen, dass Oracle zuerst den col_y-Filter verwendet und nur die Funktion für die übereinstimmenden Zeilen ausführt?
Zum Beispiel konzeptionell, obwohl ich dies funktionieren würde:
with taba as (
select fn(col_x) x from table_a where col_y in (select col_y from table_b)
)
select * from taba where x=0;
weil ich dachte, Oracle die Klausel zunächst laufen würde, aber Oracle „Optimierung“ Diese Abfrage und machen diesen Lauf genau das gleiche wie die erste Abfrage oben, wobei fn (col_x) = 0 in der where-Klausel steht.
Ich möchte, dass dies nur als Abfrage und nicht in einem PL/SQL-Block ausgeführt wird. Es scheint, als sollte es einen Weg geben, Orakel einen Hinweis zu geben oder einen anderen Trick zu machen, aber ich kann es nicht herausfinden. BTW, Tabelle ist auf col_y indiziert und wird als Zugriffsprädikat verwendet. Statistiken sind aktuell.
Welche Funktion hat 'fn'? Wenn es mehrmals mit demselben Parameter aufgerufen wird, gibt es immer den gleichen Wert zurück? Wenn ja, können Sie die Funktion als deterministisch definieren und dann einen funktionsbasierten Index darauf erstellen? – sstan
Hallo sstan, nein, es ist nicht deterministisch. Es ist eine komplexe Funktion und hat einen Cursor darin. –