Может ли INNER JOIN предлагать лучшую производительность, чем EXISTS
Я изучаю улучшение производительности в рамках ряда процедур, и недавно коллега упомянул, что он достиг значительных улучшений производительности при использовании INNER JOIN вместо EXISTS.
Как часть расследования относительно того, почему это могло быть, я думал, что задаю здесь вопрос.
Итак:
- Может ли INNER JOIN предлагать лучшую производительность, чем EXISTS?
- Какие обстоятельства могут произойти?
- Как я могу установить тестовый пример в качестве доказательства?
- Есть ли у вас полезные ссылки для дальнейшей документации?
И действительно, любой другой опыт, который люди могут затронуть на этот вопрос.
Я был бы признателен, если бы какие-либо ответы могли конкретно решить этот вопрос без каких-либо предположений о других возможных улучшениях производительности. У нас уже был довольно большой успех, и меня просто интересовал этот предмет.
Любая помощь будет высоко оценена.
Ответы
Ответ 1
Вообще говоря, INNER JOIN
и EXISTS
- разные вещи.
Первый возвращает дубликаты и столбцы из обеих таблиц, последний возвращает одну запись и, будучи предикатом, возвращает записи только из одной таблицы.
Если вы выполняете внутреннее соединение в столбце UNIQUE
, они демонстрируют такую же производительность.
Если вы выполняете внутреннее соединение в наборе записей с приложенным DISTINCT
(чтобы избавиться от дубликатов), EXISTS
обычно быстрее.
IN
и EXISTS
(с эквидиональной корреляцией) обычно используют один из нескольких алгоритмов SEMI JOIN
, которые обычно более эффективны, чем a DISTINCT
в одной из таблиц.
Смотрите эту статью в своем блоге:
Ответ 2
Может быть, может и нет.
- Тот же самый план будет сгенерирован скорее всего
- В INNER JOIN может потребоваться DISTINCT для получения того же выхода
- EXISTS имеет дело с NULL