2009-01-07 14 views
41

Jaka jest różnica między łączeniem wewnętrznym a łączeniem zewnętrznym (lewe połączenie, prawe połączenie) i która ma najlepszą ich wydajność?Różnice w połączeniu SQL

Dzięki!

Odpowiedz

78

Sprawdź ten artykuł:

A Visual Explanation of SQL Joins

Inner Join:

Left Outer Join:

prawe sprzężenie zewnętrzne:

+0

Część 2 pytania dotyczyła wydajności, która niekoniecznie jest bezpośrednio związana z metodą łączenia, czy ma Pan (i) jeszcze jakieś uwagi na ten temat? –

+0

Pamiętaj, aby przeczytać wszystkie komentarze w artykule, ponieważ jego prezentacja połączeń jako operacji zestawu jest wysoce krytyczna! Na przykład lewe połączenie NIE jest przecięciem, ponieważ tworzy nowe krotki. – bortzmeyer

+0

Schemat byłby lepszy, gdyby pokazał również FULL OUTER JOIN. Ponieważ różne rodzaje połączeń dają różne wyniki, pytanie dotyczące wydajności jest nieco nieistotne. Powinieneś wybrać ten, który daje wymagane wyniki. Wydajność zależy od wewnętrznych danych DBMS. –

0

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

EDYCJA: Ups. Zgadnij, że nie przejmujesz się tą częścią odpowiedzi.

+0

Najwyraźniej tak. – bart

3

A LEFT JOIN B jest tożsamy ​​z B RIGHT JOIN A. Niektóre RDBMS nie mają RIGHT JOIN, więc trzeba przepisać swoją logikę RIGHT JOIN do LEFT JOIN logiki

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; 

Czytaj powyższy kod jako B on RIGHT, JOINs A. Który jest taki sam jak A jest na LEWYM

Cokolwiek jest po lewej stronie, jest zawsze oceniane, zawsze ma wyjście. Można sobie wyobrazić LEFT JOIN B, B PRAWO przyłączyć się 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" )); 
     } 
4

Porównania wydajności pomiędzy typów złączeń są nieistotne, ponieważ dają wyniki differnt zestawów. Nawet jeśli wewnętrzne sprzężenie jest szybsze, nie używałbyś go, gdybyś potrzebował wyników lewego połączenia (które zawiera nawet rekordy, które nie pasują do drugiej tabeli w sprzęcie).

3

Lewy, prawy, wewnętrzny i zewnętrzny nie wpływają na wydajność i zostały już tutaj dobrze wyjaśnione.

Istnieją jednak wskazówki, które można dodać do złączeń, które mają wpływ na wydajność: hash, loop i scalanie.

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

A loopjoin przechodzi każdego wiersza w drugiej tabeli dla każdego wiersza w pierwszym. Jest to dobre, jeśli masz jeden bardzo duży stół i jeden o wiele mniejszy.

A mergejoin przechodzi przez obie tabele razem w kolejności. Może to być bardzo szybkie, jeśli obie tabele są już uporządkowane w polu, do którego dołączasz.

hashjoin wykorzystuje wiele tabel tymczasowych do grupy wyjście gdyż sortuje poprzez połączonych danych.

Niektóre specjalistyczne bloki danych obsługują także inne typy, takie jak połączenia bitmapowe.

Powiązane problemy