41 votes

Différences de jointure SQL

Quelle est la différence entre une jointure interne et une jointure externe (jointure gauche, jointure droite) et quelle est leur meilleure performance?

Merci!

77voto

CMS Points 315406

Voir cet article:

Une Explication Visuelle de Jointures SQL

Inner Join:

Jointure Externe Gauche:

Jointure Externe Droite:

4voto

HLGEM Points 54641

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).

3voto

Michael Buen Points 20453

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"  ));
        }
 

3voto

Keith Points 46288

À 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.

0voto

le dorfier Points 27267

J'espère que vous comprenez les images. En termes de performances, ils sont équivalents - pas de différence.

EDIT: Oops. Je suppose que vous ne vous souciez pas de cette partie de la réponse.

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