web-dev-qa-db-fra.com

Un INNER JOIN peut-il offrir de meilleures performances que EXISTS

J'ai cherché à améliorer les performances sur une série de procédures, et récemment un collègue a mentionné qu'il avait réalisé des améliorations significatives des performances lors de l'utilisation d'un INNER JOIN à la place d'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 que EXISTS?
  • Dans quelles circonstances cela se produirait-il?
  • Comment puis-je configurer un cas de test comme preuve?
  • Avez-vous des liens utiles vers de la documentation supplémentaire?

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

J'apprécierais que des réponses puissent répondre spécifiquement à cette question sans aucune suggestion d'autres améliorations possibles des performances. Nous avons déjà eu un certain succès, et je m'intéressais simplement à cet élément.

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

54
James Wiseman

En général, INNER JOIN et EXISTS sont des choses différentes.

Le premier retourne les doublons et les colonnes des deux tables, le second retourne un enregistrement et, étant un prédicat, retourne les enregistrements d'une seule table.

Si vous effectuez une jointure interne sur une colonne UNIQUE, ils présentent les mêmes performances.

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

IN et EXISTS clauses (avec une corrélation équijoin) emploient généralement l'un des plusieurs SEMI JOIN des algorithmes généralement plus efficaces qu'un DISTINCT sur l'une des tables.

Voir cet article dans mon blog:

54
Quassnoi

Peut-être peut-être pas.

  • Le même plan sera généré très probablement
  • Une INNER JOIN peut nécessiter un DISTINCT pour obtenir la même sortie
  • EXISTS traite de NULL
11
gbn