NOT IN или NOT EXISTS, который быстрее в Oracle10g? - PullRequest
1 голос
/ 28 декабря 2011

Может кто-нибудь объяснить разницу между IN и EXISTS и NOT IN и NOT EXISTS. Потому что я прочитал, что EXISTS будет работать лучше, чем IN, а NOT EXISTS будет работать лучше, чем NOT IN. Запрос, который я создал, выглядит следующим образом ..

delete from tt_left t
 where t.val = 0
   and t.text in (select t1.text
                      from tt_left t1
                     where t.text = t1.text
                       and t.resulttext = t1.resulttext
                       and t.val = 0
                       and t1.val = 1);

Как преобразовать это в EXISTS? Есть ли другой лучший метод?

Ответы [ 3 ]

8 голосов
/ 28 декабря 2011

Оптимизатор будет обрабатывать 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 , который имеет аналогичное заключение

4 голосов
/ 28 декабря 2011
1 голос
/ 28 декабря 2011

В некоторых форумах и сообщениях говорится, что «НЕ В НЕ И НЕ СУЩЕСТВУЕТ использует один и тот же план выполнения, и они дают одинаковые результаты в одно и то же время».

Но, по словам меня и моего опыта с множеством строк и десятками таблиц, И ПРИЧИНА:

При использовании «NOT IN» запрос выполняет полное сканирование вложенных таблиц, тогда как для «НЕ СУЩЕСТВУЕТ» запрос может использовать индекс внутри подзапроса.

Аналогичная причина для 'IN' и 'EXIST' ...

Спасибо: D

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...