2015-01-17 4 views
0

В VS EXISTS:Разница между IN и существуют в Oracle

точка 1:

В: Эффективное, когда суб-запрос содержит меньшее количество строк по сравнению с внешним запросом

существуют: эффективны, когда суб -query содержит большое количество строк по сравнению с внешним запросом. sub-query возвращает TRUE или FALSE. Внешний запрос выполняется один раз, и для каждого значения во внешнем запросе запроса выполняется

, но в последних версиях Oracle они будут, как правило, переписываться оптимизатором, чтобы быть одинаковым, используя тот же план выполнения. (Найден этот пункт в Google). План выполнения такой же, как для IN и EXIST (Наблюдаемые в моем компьютере)

Пункт 2:

Я искал в гугле для дифференциала между NOT IN и NOT EXIST. Но большинство из них предложили, чтобы оба были одинаковыми.

Мои вопросы:

Вопрос 1 (пункт 1): было мое предположение верно? Если оба обработаны одинаково с помощью oracle, тогда мы можем использовать либо IN, либо EXIST в запросах?

Вопрос 2 (пункт 2): Может кто-нибудь объяснить, почему оба они одинаковы?

+1

Посмотрите на http://stackoverflow.com/questions/12896007/oracle-in-vs-exists-difference. Разница также связана с обработкой нулевых значений. – ms32035

+0

Я всегда считал, что EXIST более результативен, поскольку этот оператор подсчитывает записи, в то время как оператор IN перечисляет ряд фактических значений.Первое кажется более простым в обработке: если найдена 1 запись, нет необходимости искать дальше, потому что уже существует логическое предложение EXIST. В то время как с IN, ему может потребоваться пройти всевозможные ценности. Неудивительно, что предложение IN возникло как список точных значений («A», «B», «C»), и в этом контексте предложение EXIST действительно отличается. – tvCa

ответ

0

Это может быть очень хорошо использует тот же путь оптимизации в настоящее время, они не отличаются,

в стороне от этого, очевидно EXISTS принимает подзапрос и IN поддерживает подзапросы и выражения список.

В некоторых случаях вам придется использовать состояние IN.

0

Если Oracle не изменит смысл этих двух вещей в 12C, вы не понимаете, что они делают.

Функция IN принимает список значений для запуска запроса. С учетом:

выбрать * из foo где bar в (1,4,3);

Это имеет значение:

выберите * из Foo где бар = 1 или бар = 4 или бар = 3;

Функция EXIST позволяет получить существенное повышение производительности при выборе подзаконным запроса, например:

выберите * из обув где где EXISTS (SELECT * FROM xfoo где XBAR = Z);

Без EXISTS весь подзапрос должен быть полностью оценен.

С СУЩЕСТВУЮЩЕМУ ПОДПРОСУСОМ нужно удовлетворить только самому первому элементу, который он находит. т.е.: если подзапрос приводит к 10 000 строк, то, как только система обнаружит 1 строку, подзапрос возвращает true и основной запрос выполняется.

Смежные вопросы