2013-05-15 6 views
5

Wiem, że dobrą praktyką programowania jest dodanie warunków filtru do klauzuli WHERE kwerendy, aby zminimalizować liczbę wierszy zwracanych w łączeniach, ale kiedy zdecydować, czy powinniśmy dodać filtr w WHERE zamiast FROM? Na przykład:Dodawanie filtra w GDZIE kontra OD

SELECT a.ColA, a.ColB, a.ColC, b.ColD, b.ColE 
FROM TblA a INNER JOIN TblB b 
On a.ColA = b.ColD 
AND a.ColA = 'X' 
AND a.ColB = 'Y' 
WHERE b.ColD = 'ABC' 

W tym zapytaniu co jeśli dodałem b.ColD w I klauzuli zamiast Gdzie? Czy to nie sprawi, że zapytanie stanie się bardziej wydajne? Wiem, że wyniki mogą się różnić w obu podejściach, ale nie wiem dlaczego?

Dzięki.

+0

sądząc po tagu tsql, używasz SQL Server. Studio zarządzania ma możliwość pokazania planu wykonania zapytania, dzięki czemu można porównać różnice obu wersji. Moim zdaniem jest to, że nie będzie dużej różnicy. –

+3

To nie jest duplikat: OP pyta o filtry, a nie o JOINy ​​ – gbn

+1

@ gbn Nie jestem pewien, czy treść OP ("filtr" vs. "warunek" itp.) Ma tak duże znaczenie, skoro przykład podany przez PO jest zasadniczo taki sam jak [tutaj] (http://stackoverflow.com/q/1907335/880904), [tutaj] (http://stackoverflow.com/q/1018952/880904), [tutaj] (http: // /stackoverflow.com/q/1401889/880904), [tutaj] (http://stackoverflow.com/q/15483808/880904) i więcej. Wszystkie te mają "JOIN ... ON", zapytaj o "GDZIE" i dołącz podobne odpowiedzi do twojego. Wydaje mi się, że to pytanie zostało wysłuchane, czy też powinniśmy ponownie otworzyć [to pytanie] (http://stackoverflow.com/q/13145275/880904)? –

Odpowiedz

2

W języku deklaratywnym, takim jak SQL, pomocne jest zachowanie maksymalnej deklaratywności, tj. Utrzymanie logiki JOIN ("w jaki sposób chcę połączyć moje dane?") Oddzielnie od logiki WHERE ("co chcę filtrować? na zewnątrz?").

Technicznie nie ma absolutnie żadnej różnicy, ale jest to dobre sprawdzenie zdrowia psychicznego, jeśli zmusisz się do rozdzielenia dwóch.

9

To rzadko robi różnicę w moim doświadczeniu. Może, ale nie często. Optymalizator zapytań działa w ten sposób i nie trzeba go zgadywać.

Podczas korzystania LEFT JOIN choć to może znaczenia, ponieważ zmienia semantyki zapytania

Generalnie I would separate JOIN and WHERE conditions for clarity and avoid ambiguities or partial/full cross joins. Ta odpowiedź jest uzyskać więcej informacji tylko

Uwaga: pytanie brzmi nie „przyłączyć WHERE różnicy”, ale „gdzie w różnicy join”

Chciałbym po prostu zrobić to

SELECT 
    a.ColA, a.ColB, a.ColC, b.ColD, b.ColE 
FROM 
    TblA a 
    INNER JOIN 
    TblB b On a.ColA = b.ColD 
WHERE 
    a.ColA = 'X' AND a.ColB = 'Y' AND b.ColD = 'ABC' 

lub, jeśli bardziej złożona i chciałem, aby go odczytać lepiej
ta może również pomóc, jeśli optymalizator jest głupi (rzadko):

SELECT 
    a.ColA, a.ColB, a.ColC, b.ColD, b.ColE 
FROM 
    (SELECT ColA, ColB, ColC FROM TblA 
    WHERE ColA = 'X' AND ColB = 'Y') a 
    INNER JOIN 
    (SELECT ColD, ColE FROM TblB WHERE ColD = 'ABC') b On a.ColA = b.ColD 

W tym ostatnim przypadku można zastosować współczynniki CTE zbyt rozbicie go dalej do czytelności