59 votes

Un INNER JOIN peut-il offrir de meilleures performances qu'un EXISTS ?

J'ai cherché à améliorer les performances d'une série de procédures et, récemment, un collègue a mentionné qu'il avait obtenu des améliorations significatives des performances en utilisant un INNER JOIN à la place de EXISTS.

Dans le cadre de l'enquête sur les raisons de cette situation, j'ai pensé poser la question ici.

Donc :

  • Un INNER JOIN peut-il offrir de meilleures performances qu'un EXISTS ?
  • Dans quelles circonstances cela se produirait-il ?
  • Comment puis-je mettre en place un cas d'essai comme preuve ?
  • Avez-vous des liens utiles vers d'autres documents ?

Et vraiment, toute autre expérience que les gens peuvent apporter à cette question.

J'apprécierais que toute réponse réponde spécifiquement à cette question sans suggérer d'autres améliorations possibles des performances. Nous avons déjà obtenu un certain succès, et je ne m'intéressais qu'à ce seul point.

Toute aide serait très appréciée.

58voto

Quassnoi Points 191041

D'une manière générale, INNER JOIN y EXISTS sont des choses différentes.

La première renvoie les doublons et les colonnes des deux tables, la seconde renvoie un enregistrement et, étant un prédicat, ne renvoie que les enregistrements d'une seule table.

Si vous faites une jointure interne sur un UNIQUE ils présentent les mêmes performances.

Si vous effectuez une jointure interne sur un jeu d'enregistrements avec DISTINCT appliqué (pour se débarrasser des doublons), EXISTS est généralement plus rapide.

IN y EXISTS (avec une corrélation équijoint) emploient habituellement l'une des plusieurs SEMI JOIN qui sont généralement plus efficaces qu'un DISTINCT sur l'une des tables.

Voir cet article dans mon blog :

11voto

gbn Points 197263

Peut-être, peut-être pas.

  • Le même plan sera probablement généré
  • Un INNER JOIN peut nécessiter un DISTINCT pour obtenir le même résultat.
  • EXISTS traite de NULL

1voto

Roma Ruzich Points 558

En sql server 2019 les requêtes avec IN , EXIST , JOIN ont des plans différents (si les index corrects sont ajoutés). Les performances sont donc également différentes. Cela est montré dans l'article https://www.mssqltips.com/sqlservertip/6659/sql-exists-vs-in-vs-join-performance-comparison/ que JOIN est un peu plus rapide.

P.S. Je comprends que la question portait sur sql server 2005 (dans les balises), mais les gens cherchent surtout la réponse par le titre de l'article.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X