Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Verwendet Oracle eine Kurzschlussauswertung?

Es hängt davon ab ... Im Allgemeinen garantiert Oracle nicht, dass eine SQL-Anweisung eine Kurzschlussauswertung verwendet (obwohl PL/SQL garantiert eine Kurzschlussauswertung durchführt). Dem Oracle-Optimierer steht es frei, die Prädikate in jeder Reihenfolge auszuwerten, die er für am effizientesten hält. Das könnte bedeuten, dass das erste Prädikat zuerst ausgewertet wird und nur die übereinstimmenden Zeilen das zweite Prädikat ausgewertet haben, aber es ist durchaus möglich, dass entweder das Gegenteil passiert oder dass Oracle die Abfrage in eine Art UNION umwandelt und wertet beide Prädikate vollständig aus, bevor die Ergebnisse kombiniert werden.

Davon abgesehen, wenn der Optimierer zur Kompilierzeit feststellen kann, dass ein Prädikat immer zu TRUE ausgewertet wird oder FALSE , sollte der Optimierer das einfach als Konstante behandeln. Wenn es also zum Beispiel eine Einschränkung für die Tabelle gibt, die X verhindert Der Optimierer sollte das zweite Prädikat überhaupt nicht auswerten (obwohl verschiedene Versionen des Optimierers unterschiedliche Fähigkeiten haben werden, um zu erkennen, dass etwas zur Kompilierzeit eine Konstante ist).

Was den zweiten Teil Ihrer Frage betrifft, ist es sehr schwer zu sagen, ohne die Abfragepläne zu sehen. Der Oracle-Optimierer ist in der Regel ziemlich gut darin, Abfragen von einer Form in eine andere umzuwandeln, wenn es effizientere Möglichkeiten gibt, sie auszuwerten. Im Allgemeinen gilt jedoch, wenn subQ wird im Vergleich zu table eine relativ große Anzahl von Zeilen zurückgeben , kann es effizienter sein, die Abfrage als EXISTS zu strukturieren statt als IN .