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
.