Среди некоторых разработчиков SQL Server широко распространено мнение, что NOT IN
оно ужасно медленное , и запросы должны быть переписаны так, чтобы они возвращали тот же результат, но не использовали «злые» ключевые слова. ( пример ).
Есть ли в этом правда?
Например, существует ли какая-либо известная ошибка в SQL Server (какая версия?), Из-за которой запросы, использующие запросы, NOT IN
имеют худший план выполнения, чем эквивалентный запрос, использующий
- в
LEFT JOIN
сочетании сNULL
чеком или (SELECT COUNT(*) ...) = 0
вWHERE
пункте?
IN
/NOT IN
всегда будет реализован с помощью вложенных циклов. И я понятия не имею, чтоstops SQL Server from creating a ‘plan’
должно означать.Ответы:
Я не думаю, что это имеет какое-то отношение к тому, чтобы быть ужасно медленным; это имеет отношение к тому, чтобы быть потенциально неточным. Например, с учетом следующих данных - заказов, которые могут быть размещены либо отдельным клиентом, либо партнером B2B:
Допустим, я хочу найти всех клиентов, которые никогда не размещали заказ. Учитывая данные, есть только один: клиент № 2. Вот три способа написать запрос для поиска этой информации (есть и другие):
Результаты:
Теперь есть некоторые проблемы с производительностью, и я расскажу о них в этом посте . В зависимости от данных и индексов,
NOT EXISTS
как правило, выигрываютNOT IN
, и я не знаю, может ли он когда-либо работать хуже. Следует также отметить, чтоEXCEPT
может быть введена отдельная операция сортировки, поэтому вы можете получить разные данные (опять же, в зависимости от источника). И что популярныйLEFT OUTER JOIN ... WHERE right.column IS NULL
шаблон всегда худший исполнитель.У Мартина Смита также много полезной информации в ответе на SO .
источник