2010-04-16 18 views

Odpowiedz

11

Drugi sposób to klasyczny sposób robienia tego, zanim istniało słowo kluczowe join.

Zwykle procesor kwerend generuje te same operacje bazy danych z dwóch zapytań, więc nie byłoby różnicy w wydajności.

Korzystanie z join lepiej opisuje, co robisz w zapytaniu. Jeśli masz wiele złączeń, jest to również lepsze, ponieważ połączony stół i jego stan są obok siebie, zamiast umieszczania wszystkich tabel w jednym miejscu i wszystkich warunków w innym.

Innym aspektem jest to, że łatwiej jest zrobić nielimitowane łączenie przez pomyłkę, stosując drugi sposób, w wyniku czego następuje połączenie krzyżowe zawierające wszystkie kombinacje z dwóch tabel.

+0

Uzgodnione, pierwsze jest lepsze dla przejrzystości i kontrole; łatwiej jest zmienić typ łączenia, jeśli chcesz. –

1

dowiedzieć się za pomocą EXPLAIN SELECT …

to zależy od zastosowanego silnika, na optymalizator zapytań, na klawiszach, na stole; na prawie wszystko

3

Użyj pierwszy, jak to jest:

  • bardziej wyraźne
  • jest sposób standardowy

chodzi o wydajność - nie powinno być żadnej różnicy.

+2

Umożliwia także oddzielenie warunków łączenia (w klauzulach ON) od warunków filtrowania (w klauzuli WHERE). –

0

Większość aktualnych baz danych zoptymalizuje oba te zapytania do dokładnie tego samego planu wykonania. Jednak użyj pierwszej składni, jest to obecny standard. Dzięki poznawaniu i używaniu tej składni sprzężenia, pomoże to w przypadku zapytań z LEFT OUTER JOIN i RIGHT OUTER JOIN. które stają się trudne i problematyczne przy użyciu starszej składni z połączeniami w klauzuli WHERE.

+0

Znalazłem, że w poprawnie znormalizowanej bazie danych łączenie PRAWE powinno być rzadko (kiedykolwiek?) Używane, w denormalizowanej bazie danych, jednak nie zawsze jest to prawda. Używam tego jako jednej miary potrzeby do refaktoryzacji normalizacji/struktury. –

+0

@ Mark Schultheiss, zobacz to pytanie: http://stackoverflow.com/questions/689963/does-anyone-use-right-outer-insins –

+0

dokładnie, po prostu zmiana kolejności tabel często spowoduje, że prawo dołączy do lewego połączenia, co z mojego doświadczenia jest łatwiejsze w cyklach konserwacyjnych, szczególnie dla młodszych programistów. –

1

W niektórych silnikach SQL druga forma (asocjacyjne sprzężenia) jest wyleczona. Użyj pierwszego formularza.

Po drugie jest mniej jednoznaczne, powoduje, że początkujący do SQL, aby wstrzymać podczas pisania kodu. O wiele trudniej jest zarządzać złożonym SQL ze względu na sekwencję wymaganego dopasowania, aby dopasować sekwencję klauzuli WHERE - muszą one (squence w kodzie) muszą się zgadzać lub zwrócone wyniki zmienią się, zmieniając zestaw zwróconych danych, co naprawdę jest sprzeczne myśl, że sekwencja nie powinna zmieniać wyników, gdy rozważane są elementy na tym samym poziomie.

Po utworzeniu połączeń zawierających wiele tabel, bardzo trudno jest kodować dość szybko za pomocą drugiego formularza.

EDYCJA: Wydajność: uważam kodowanie, debugowanie ułatwia wykonywanie czynności osobistych, dlatego łatwość edycji/debugowania/konserwacji jest lepsza przy użyciu pierwszego formularza - zajmuje mi to tylko mniej czasu na zrobienie/zrozumienie rzeczy podczas tworzenia i cykle konserwacji.

+1

Dla jasności zdeponowana forma to "* =" i "= *" w formularzu dla LEWEGO i PRAWEGO, a nie standardowego przecinka ANSI dla tabel. ..strasznie, jeśli dodam zamieszanie przez tę część :) –

0

Filtrowanie łączy wyłącznie za pomocą WHERE może być bardzo nieefektywne w niektórych typowych sytuacjach.Na przykład:

SELECT * FROM people p, companies c WHERE p.companyID = c.id AND p.firstName = 'Daniel' 

Większość baz danych będzie wykonać to zapytanie dosłownie, najpierw biorąc iloczyn kartezjański ludzi i firm tabel, a następnie filtrowany przez te, które mają pasujące pola companyID i id. Podczas gdy w pełni nieskrępowany produkt nie istnieje nigdzie poza pamięcią, a potem tylko przez chwilę, jego obliczenie zajmuje trochę czasu.

Lepszym podejściem jest grupowanie wiązań za pomocą JOIN w odpowiednich miejscach. Jest to nie tylko subiektywnie łatwiejsze do odczytania, ale także znacznie wydajniejsze. Wygląda następująco:

SELECT * FROM people p JOIN companies c ON p.companyID = c.id 
    WHERE p.firstName = 'Daniel' 

Jest to trochę dłużej, ale baza danych jest w stanie spojrzeć w klauzuli ON i używać go obliczyć pełni ograniczone DOŁĄCZ bezpośrednio, zamiast koncentrować się wszystkiego, a następnie ograniczenie w dół. Jest to szybsze do obliczenia (zwłaszcza w przypadku dużych zestawów danych i/lub łączenia wielu tabel) i wymaga mniej pamięci.

Zmieniam każde zapytanie, które widzę, używając składni "comma JOIN". Moim zdaniem jedynym celem jego istnienia jest zwięzłość. Biorąc pod uwagę wpływ na wydajność, nie sądzę, że jest to istotny powód.

Powiązane problemy