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!
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!
Vérifiez cet article:
A Visual Explanation of SQL Joins
jointure interne:
gauche jointure externe:
jointure externe droite:
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.
Apparemment il le fait. – bart
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" ));
}
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).
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 loop
join
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 merge
join
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 hash
join
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.
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? –
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
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. –