Filtrowanie złączeń wyłącznie za pomocą WHERE
może być bardzo nieefektywny w niektórych typowych scenariuszach. Na przykład:
SELECT * FROM people p, companies c
WHERE p.companyID = c.id AND p.firstName = 'Daniel'
Większość baz danych wykona to zapytanie całkiem dosłownie, najpierw biorąc produkt kartezjański
z people
i companies
tabele i następnie filtrowanie według tych, które mają pasujące companyID
i id
pola. Chociaż w pełni nieograniczony produkt nie istnieje nigdzie poza pamięcią i to tylko przez chwilę, jego obliczenie zajmuje trochę czasu.
Lepszym podejściem jest zgrupowanie ograniczeń za pomocą JOIN
s tam, gdzie ma to zastosowanie. Jest to nie tylko subiektywnie łatwiejsze do odczytania, ale także znacznie wydajniejsze. A zatem:
SELECT * FROM people p JOIN companies c ON p.companyID = c.id
WHERE p.firstName = 'Daniel'
To trochę dłużej, ale baza danych jest w stanie spojrzeć na ON
klauzuli i użyj jej do obliczenia w pełni ograniczonego JOIN
bezpośrednio, zamiast zaczynać od wszystko a następnie ograniczenie w dół. Jest to szybsze do obliczeń (zwłaszcza w przypadku dużych zestawów danych i/lub złączeń wielu tabel) i wymaga mniej pamięci.
Zmieniam każde zapytanie, które widzę, które używa „przecinka JOIN
" składnia. Moim zdaniem jedynym celem jego istnienia jest zwięzłość. Biorąc pod uwagę wpływ na wydajność, nie sądzę, aby był to przekonujący powód.