Оптимизатор будет обрабатывать IN
и EXISTS
одинаково (, если , предложение IN не является списком констант)
Это потому, что это «полусоединение»
Аналогично, NOT IN
и NOT EXISTS
будут обычно обрабатываться одинаково. Это «анти-полусоединение». Исключение составляют случаи, когда у вас есть NULL в подзапросе NOT IN. Это приводит к тому, что NOT IN всегда будет ложным
Таким образом, с точки зрения производительности без разницы , но EXISTS
/ NOT EXISTS
всегда будет правильно
См. " НЕ ВНУТРИ против НЕ СУЩЕСТВУЕТ против ЛЕВОГО СОЕДИНЕНИЯ / НУЛЬ: Oracle "
Оптимизатор Oracle может видеть, что NOT EXISTS, NOT IN и LEFT JOIN / IS NULL семантически эквивалентны, если значения списка объявлены как NOT NULL.
Он использует один и тот же план выполнения для всех трех методов и дает одинаковые результаты в одно и то же время.
В Oracle безопасно использовать любой из трех методов, описанных выше, для выбора значений из таблицы, которые отсутствуют в другой таблице.
Однако, если значения не гарантированы как NOT NULL, следует использовать LEFT JOIN / IS NULL или NOT EXISTS, а не NOT IN, поскольку последние будут давать разные результаты в зависимости от того, есть ли значения NULL в набор результатов подзапроса.
И IN против JOIN против EXISTS: Oracle , который имеет аналогичное заключение