2015-06-10 13 views
5

Która klauzula wykonuje się najpierw w instrukcji SELECT?Która wykonuje pierwszą klauzulę WHERE lub klauzulę JOIN

Mam wątpliwości w pytaniu select na tej podstawie.

pod poniższym przykładzie

SELECT * 
FROM #temp A 
INNER JOIN #temp B ON A.id = B.id 
INNER JOIN #temp C ON B.id = C.id 
WHERE A.Name = 'Acb' AND B.Name = C.Name 
  1. czy, po pierwsze sprawdza WHERE klauzula a następnie wykonuje INNER JOIN

  2. Pierwszy JOIN a następnie sprawdza warunek?

Jeśli najpierw wykonuje JOIN i WHERE warunek; w jaki sposób może on osiągnąć więcej, gdy warunki dla różnych JOIN s?

+1

Być może pomogłoby to: http://stackoverflow.com/questions/879893/sql-order-of-operations –

+2

Istnieje * logiczna * kolejność przetwarzania operacji, ale systemy baz danych mogą ponownie zamówić te operacje pod warunkiem, że wygenerowane wyniki końcowe są takie same, jak po logicznym przetwarzaniu zamówienie. Nie powinieneś przejmować się faktycznym zamówieniem, chyba że działa źle - powinieneś powiedzieć serwerowi "czego chcesz", a nie "jak to zrobić". –

+0

To pomoże: http://stackoverflow.com/questions/19477950/ są-wewnętrzne-dołączenie-i-zewnętrzne-konieczne-złączenie/19478161 # 19478161 – Deepshikha

Odpowiedz

6

koncepcyjne kolejność przetwarzania zapytań jest:

1. FROM 
2. WHERE 
3. GROUP BY 
4. HAVING 
5. SELECT 
6. ORDER BY 

Ale to tylko koncepcyjne zamówienie. W rzeczywistości silnik może zdecydować się na zmianę klauzul. Oto dowód.Pozwala zrobić 2 tabele z wierszy 1000000 każda:

CREATE TABLE test1 (id INT IDENTITY(1, 1), name VARCHAR(10)) 
CREATE TABLE test2 (id INT IDENTITY(1, 1), name VARCHAR(10)) 


;WITH cte AS(SELECT -1 + ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) d FROM 
(VALUES(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) t1(n) CROSS JOIN 
(VALUES(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) t2(n) CROSS JOIN 
(VALUES(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) t3(n) CROSS JOIN 
(VALUES(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) t4(n) CROSS JOIN 
(VALUES(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) t5(n) CROSS JOIN 
(VALUES(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) t6(n)) 

INSERT INTO test1(name) SELECT 'a' FROM cte 

Teraz uruchom 2 zapytania:

SELECT * FROM dbo.test1 t1 
JOIN dbo.test2 t2 ON t2.id = t1.id AND t2.id = 100 
WHERE t1.id > 1 


SELECT * FROM dbo.test1 t1 
JOIN dbo.test2 t2 ON t2.id = t1.id 
WHERE t1.id = 1 

Wskazówka najpierw filtruje większość wierszy w join stanie, drugi w where stanie. Spojrzeć wytwarzanych planów:

1 TableScan - bazowe.... [Test] [dbo] [test2] [id] w [t2] [id] = (100)

2 TableScan - orzeczenie.... [test] [dbo] [test2] [id] w [t2] [id] = (1)

oznacza to, że w pierwszym zapytaniu zoptymalizowanej zdecydował pierwszy oceny join warunków filtrowania obecnie wiersze, w drugim oceniano najpierw klauzulę where.

2

Można odwołać MSDN

wybrany przez zapytaniu wiersze są filtrowane przez pierwszy klauzuli FROM dołączyć warunków, wówczas warunki wyszukiwania klauzula, a następnie HAVING warunki wyszukiwania klauzula. Wewnętrzne łączenia można określić w klauzulą ​​FROM lub WHERE bez wpływu na wynik końcowy.

Można również użyć SET SHOWPLAN_ALL ON przed wykonaniem zapytanie, aby zobaczyć plan wykonania zapytania, tak aby można było mierzyć różnicę wydajności w dwóch.

4

logicznej kolejności etapów przetwarzania zapytanie jest:

  1. FROM - w tym JOIN s
  2. WHERE
  3. GROUP BY
  4. HAVING
  5. SELECT
  6. ORDER BY

można mieć tyle, ile warunkach nawet na swoim JOIN s lub WHERE klauzul. Jak:

Select * from #temp A 
INNER JOIN #temp B ON A.id = B.id AND .... AND ... 
INNER JOIN #temp C ON B.id = C.id AND .... AND ... 
Where A.Name = 'Acb' 
AND B.Name = C.Name 
AND .... 
1

można odnieść się do tego join optimization

SELECT * FROM T1 INNER JOIN T2 ON P1(T1,T2) 
       INNER JOIN T3 ON P2(T2,T3) 
    WHERE P(T1,T2,T3) 

zagnieżdżonych pętli przyłączyć algorytm będzie wykonać to zapytanie w następujący sposób:

FOR each row t1 in T1 { 
    FOR each row t2 in T2 such that P1(t1,t2) { 
    FOR each row t3 in T3 such that P2(t2,t3) { 
     IF P(t1,t2,t3) { 
     t:=t1||t2||t3; OUTPUT t; 
     } 
    } 
    } 
} 
Powiązane problemy