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!
5 answers
Zobacz ten artykuł:
Wizualne wyjaśnienie połączenia SQL
Połączenie Wewnętrzne:
Left Outer Join:
Prawy Zewnętrzny Łącznik:
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).
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" ));
}
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.
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.
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