Это зависит.
,
В целом, Oracle не гарантирует, что в операторе SQL будет использоваться оценка короткого замыкания (хотя PL / SQL гарантированно выполняет оценку короткого замыкания). Оптимизатор Oracle может свободно оценивать предикаты в любом порядке, который он ожидает, чтобы быть наиболее эффективным. Это может означать, что первый предикат оценивается первым, и только второй совпадающий ряд оценивается вторым предикатом, но вполне возможно, что произойдет обратное или Oracle преобразует запрос в вид UNION
и полностью оценивает оба предиката перед объединением результаты.
При этом, если оптимизатор может определить во время компиляции, что предикат всегда будет иметь значение TRUE
или FALSE
, оптимизатор должен просто воспринимать это как константу. Так, если, например, в таблице есть ограничение, которое не позволяет X
иметь значение 'true', оптимизатор вообще не должен оценивать второй предикат (хотя разные версии оптимизатора будут иметь разные возможности) обнаружить, что что-то является константой во время компиляции).
Что касается второй части вашего вопроса, то, не видя планов запросов, очень трудно сказать. Оптимизатор Oracle, как правило, хорошо умеет преобразовывать запросы из одной формы в другую, если существуют более эффективные способы ее оценки. В общем, однако, если subQ
собирается вернуть относительно большое количество строк по сравнению с table
, может быть более эффективно структурировать запрос как EXISTS
, а не как IN
.