Quelle est la différence entre une jointure interne et une jointure externe (jointure gauche, jointure droite) et quelle est leur meilleure performance?
Merci!
Quelle est la différence entre une jointure interne et une jointure externe (jointure gauche, jointure droite) et quelle est leur meilleure performance?
Merci!
Voir cet article:
Une Explication Visuelle de Jointures SQL
Inner Join:
Jointure Externe Gauche:
Jointure Externe Droite:
Les comparaisons de performances entre types de jointures ne sont pas pertinentes car elles donnent des ensembles de résultats différents. Même si une jointure interne est plus rapide, vous ne l'utiliseriez pas si vous aviez 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).
A LEFT JOIN B
est identique à B RIGHT JOIN A
. Certains SGBDR ne pas RIGHT JOIN
, donc vous devez réécrire votre RIGHT JOIN
logique 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;
Lisez le code ci-dessus en tant que B on RIGHT, JOINs A
. Ce qui est identique à A est à GAUCHE
Tout ce qui est à gauche, est toujours évalué, a toujours une sortie. Vous pouvez imaginer A GAUCHE JOINDRE B, B DROITE JOINDRE 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" ));
}
À gauche, à droite, interne et externe n'affecte pas les performances, et ils ont été bien expliqué ici déjà.
Cependant, il existe des conseils, que vous pouvez ajouter à joint qui ne effet de la performance: de hachage, de la boucle et de fusion.
Normalement, le planificateur de requête décide laquelle de ces à faire, mais de temps en temps, vous pouvez améliorer les performances en la remplaçant.
Un loop
join
passe à travers chaque ligne dans le deuxième tableau, pour chaque ligne de la première. C'est bien si vous avez une très grande table et un beaucoup plus petit.
Un merge
join
passe à travers les deux tables ensemble dans l'ordre. Il peut être très rapide si les deux tables sont déjà commandés par le champ que vous êtes le rejoindre sur.
Un hash
join
utilise beaucoup de tables temporaires à des du groupe la sortie comme il trie les données jointes.
Un spécialiste de la DBs prend également en charge d'autres types, tels que le bitmap rejoint.
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.