Может ли INNER JOIN предложить лучшую производительность, чем EXISTS? - PullRequest
53 голосов
/ 01 февраля 2010

Я занимался расследованием улучшения производительности ряда процедур, и недавно один из коллег упомянул, что он достиг значительных улучшений производительности при использовании INNER JOIN вместо EXISTS.

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

Итак:

  • Может ли INNER JOIN предложить лучшую производительность, чем EXISTS?
  • Какие обстоятельстваможет ли это произойти?
  • Как я могу настроить контрольный пример в качестве доказательства?
  • У вас есть полезные ссылки на дополнительную документацию?

И действительно, любойдругой опыт, который люди могут применить к этому вопросу.

Я был бы признателен, если бы какие-либо ответы могли касаться этого вопроса конкретно, без каких-либо предположений о других возможных улучшениях производительности.Мы уже достигли определенной степени успеха, и я просто заинтересовался этим одним предметом.

Любая помощь будет высоко ценится.

Ответы [ 2 ]

53 голосов
/ 01 февраля 2010

Вообще говоря, INNER JOIN и EXISTS - это разные вещи.

Первый возвращает дубликаты и столбцы из обеих таблиц, последний возвращает одну запись и, будучи предикатом, возвращает записи только из одной таблицы.

Если вы выполняете внутреннее соединение для столбца UNIQUE, они показывают одинаковую производительность.

Если вы выполняете внутреннее соединение с набором записей с применением DISTINCT (чтобы избавиться от дубликатов), EXISTS обычно быстрее.

В предложениях

IN и EXISTS (с корреляцией равных чисел) обычно используется один из нескольких алгоритмов SEMI JOIN, которые обычно более эффективны, чем DISTINCT в одной из таблиц.

Смотрите эту статью в моем блоге:

9 голосов
/ 01 февраля 2010

Может быть, а может и нет.

  • Скорее всего, будет сгенерирован тот же план
  • ВНУТРЕННЕМУ СОЕДИНЕНИЮ может потребоваться DISTINCT для получения того же результата
  • EXISTS имеет дело с NULL
...