Здесь есть много вводящих в заблуждение ответов, в том числе и крайне одобренных (хотя я не верю, что их действия означали вред). Краткий ответ: это одно и то же.
Существует много ключевых слов в (T-) языке SQL, но, в конце концов, единственное, что действительно происходит на аппаратном уровне, - это операции, как видно из плана запроса на выполнение.
Реляционная (математическая теория) операция, которую мы выполняем при вызове [NOT] IN
и [NOT] EXISTS
, является полусоединением (против объединения при использовании NOT
). Не случайно соответствующие операции sql-сервера имеют с таким же именем . Нет операции, которая упоминает IN
или EXISTS
где-либо - только (анти) полусоединения. Таким образом, не существует способа, которым логически эквивалентный выбор IN
vs EXISTS
мог бы повлиять на производительность, потому что существует один и единственный способ, (анти) операция соединения с полусоединением, чтобы получить свои результаты .
Пример:
Запрос 1 ( план )
select * from dt where dt.customer in (select c.code from customer c where c.active=0)
Запрос 2 ( план )
select * from dt where exists (select 1 from customer c where c.code=dt.customer and c.active=0)