Różnice SQL Join

Jaka jest różnica między łącznikiem wewnętrznym a zewnętrznym (łącznik lewy,łącznik prawy) i która z nich ma najlepszą wydajność?

Dzięki!

 41
Author: CMS, 2009-01-07

5 answers

Zobacz ten artykuł:

Wizualne wyjaśnienie połączenia SQL

Połączenie Wewnętrzne:

Left Outer Join:

Prawy Zewnętrzny Łącznik:

 77
Author: CMS,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-08 14:09:40

Porównywanie wydajności pomiędzy typami połączeń nie ma znaczenia, ponieważ dają różne zestawy wyników. Nawet jeśli połączenie wewnętrzne jest szybsze, nie używasz go, jeśli potrzebujesz wyników połączenia lewego (które obejmuje nawet rekordy, które nie pasują do drugiej tabeli w połączeniu).

 4
Author: HLGEM,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-07 14:25:00

A LEFT JOIN B jest tym samym co B RIGHT JOIN A. Niektóre RDBM nie mają RIGHT JOIN, więc musisz przepisać swoją RIGHT JOIN logikę na LEFT JOIN logikę

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;

Odczytaj powyższy kod jako B on RIGHT, JOINs A. Która jest taka sama jak A jest po lewej

Cokolwiek jest po lewej, jest zawsze oceniane, zawsze ma wyjście. Można sobie wyobrazić, że a w lewo dołącza B, B w prawo dołącza a jako:

        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"  ));
        }
 3
Author: Michael Buen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-02 06:53:41

Lewa, prawa, wewnętrzna i zewnętrzna nie wpływają na wydajność, i zostały one już tutaj dobrze wyjaśnione.

Istnieją jednak wskazówki, które można dodać do złączeń, które działają na efekt: hash, loop i merge.

Zwykle planista zapytań decyduje, które z nich należy wykonać, ale czasami można poprawić wydajność, nadpisując je.

A loop join przechodzi przez każdy wiersz w drugiej tabeli dla każdego wiersza w pierwszym. To jest dobre, jeśli masz jeden bardzo duży stół i jeden znacznie mniejszy.

A merge join przechodzi przez oba stoły razem w porządku. Może to być bardzo szybkie, jeśli obie tabele są już uporządkowane według pola, do którego się łączysz.

A hash join używa wielu tabel tymczasowych do grupowania danych wyjściowych podczas sortowania połączonych danych.

Niektórzy specjaliści DBs obsługują również inne typy, takie jak połączenia Bitmapowe.

 3
Author: Keith,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-06 08:40:06

Mam nadzieję, że rozumiesz zdjęcia. Pod względem wydajności są równoważne - bez różnicy.

EDIT: UPS. Chyba nie obchodziła Cię ta część odpowiedzi.

 0
Author: dkretz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-07 06:47:48