2009-01-07 8 views
41

Quelle est la différence entre la jointure interne et la jointure externe (jointure à gauche, jointure à droite), et quelle est la meilleure performance?Différences de jointure SQL

Merci!

Répondre

78

Vérifiez cet article:

A Visual Explanation of SQL Joins

jointure interne:

gauche jointure externe:

jointure externe droite:

+0

La partie 2 de la question portait sur les performances qui ne sont pas nécessairement directement liées à la méthode de jointure, avez-vous d'autres commentaires à formuler à ce sujet? –

+0

Assurez-vous de lire tous les commentaires de l'article car sa présentation des jointures en tant qu'opérations est très critiquable! Par exemple, une jointure à gauche n'est PAS une intersection, car elle crée de nouveaux tuples. – bortzmeyer

+0

Le diagramme serait meilleur s'il affichait aussi FULL OUTER JOIN. Étant donné que les différents types de jointures donnent des résultats différents, la question sur les performances n'est pas pertinente. Vous devriez choisir celui qui produit les résultats requis. Les performances dépendent de l'interne du SGBD. –

0

Espérons que vous comprenez les images. En termes de performance, ils sont équivalents - pas de différence.

EDIT: Oups. Je suppose que vous ne vous êtes pas soucié de cette partie de la réponse.

+0

Apparemment il le fait. – bart

3

Un LEFT JOIN B est le même que B RIGHT JOIN A. Certains SGBDR ne pas RIGHT JOIN, donc vous devez réécrire votre logique RIGHT JOIN-LEFT JOIN logique

A 1 2 3 
B 2 3 4 3 

SELECT A.I FROM INNER JOIN B ON B.I = A.I; 

output: 2 3, 3 

SELECT A.I AS X, B.I AS Y FROM A LEFT JOIN B ON B.I = A.I; 

read above code as A on LEFT, JOINs B 

output: 

X Y 
1 NULL 
2 2 
3 3 
3 3 

SELECT A.I AS X, B.I AS Y FROM B RIGHT JOIN A ON A.I = B.I; 

Lire le code ci-dessus B on RIGHT, JOINs A. Ce qui est exactement le même que A est à GAUCHE

Tout ce qui est à gauche, est toujours évalué, a toujours une sortie. Vous pouvez imaginer LEFT JOIN B, B RIGHT JOIN A comme:

 var result = new Dictionary<int, int?>(); 

     var A = new int[] { 1, 2, 3 }; 
     var B = new int[] { 2, 3, 4, 3 }; 

     foreach (int aElem in A) 
     { 


      bool hasMatch = false; 
      foreach (int bElem in B) 
      { 
       if (bElem == aElem) 
       { 
        result.Add(aElem, bElem); 
        hasMatch = true; 
       } 
      } 

      if (!hasMatch) 
       result.Add(aElem, null); 
     } 



     foreach(int X in result.Keys) 
     { 
      MessageBox.Show(string.Format("X {0} Y {1}", X, result[X].HasValue ? result[X].Value.ToString() : "NULL" )); 
     } 
4

comparisions de performance entre les types de jointures ne sont pas pertinents car ils donnent ensembles de résultats differnt. Même si une jointure interne est plus rapide, vous ne l'utiliserez pas si vous avez besoin des résultats d'une jointure à gauche (qui inclut même les enregistrements qui ne correspondent pas à la deuxième table de la jointure).

3

Gauche, droite, intérieure et extérieure n'affectent pas les performances, et elles ont déjà été expliquées ici. Cependant, il existe des conseils que vous pouvez ajouter aux jointures qui affectent les performances: hachage, boucle et fusion.

Normalement, le planificateur de requêtes décide de ce qu'il doit faire, mais parfois vous pouvez améliorer les performances en le remplaçant.

A loopjoin passe à travers chaque ligne de la deuxième table pour chaque ligne de la première. C'est bien si vous avez une très grande table et une beaucoup plus petite.

Un mergejoin passe en revue les deux tables dans l'ordre. Cela peut être très rapide si les deux tables sont déjà triées par le champ auquel vous vous joignez.

Un hashjoin utilise beaucoup de tables temporaires pour regrouper la sortie lors du tri des données jointes.

Certains DB spécialisés prennent également en charge d'autres types, tels que les jointures bitmap.

Questions connexes