2015-06-10 19 views
5

Quale clausola esegue per prima in una dichiarazione SELECT?Quale esegue prima la clausola WHERE o la clausola JOIN

Ho un dubbio nella domanda select su questa base.

considerano l'esempio di seguito

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. tratti, prima controlla WHERE clausola e quindi esegue INNER JOIN

  2. Prima JOIN e poi controlla condizione?

Se esegue prima JOIN e poi WHERE condizione; come può eseguire più dove condizioni per diversi JOIN s?

+1

Forse questo sarebbe di aiuto: http://stackoverflow.com/questions/879893/sql-order-of-operations –

+2

Esiste un ordine di elaborazione * logico * per le operazioni, ma i sistemi di database sono liberi di riordinare le operazioni a condizione che i risultati finali prodotti siano gli stessi che hanno seguito l'elaborazione logica ordine. Non dovresti preoccuparti dell'ordine, a meno che non stia funzionando male - dovresti dire al server "cosa vuoi", non "come farlo" –

+0

Questo aiuterà: http://stackoverflow.com/questions/19477950/ sono-inner-join-and-outer-join-necessaria/19478161 # 19478161 – Deepshikha

risposta

6

L'ordine concettuale di elaborazione delle query è:

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

Ma questo è solo un ordine concettuale. In effetti il ​​motore può decidere di riorganizzare le clausole. Ecco la prova.Consente di fare 2 tavoli con 1000000 righe ciascuno:

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 

Ora gestiscono 2 domande:

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 

Avviso primo sarà filtrare la maggior parte delle righe in join condizioni, secondo in where condizione. Guardate piani prodotte:

1 TableScan - Predicate:.... [Test] [dbo] [test2] [id] come [t2] [id] = (100)

2 TableScan - predicate:.... [test] [dbo] [test2] [id] come [t2] [id] = (1)

Il che significa che in prima query ottimizzata ha deciso prima di valutare join condizioni per filtrare fuori righe, nel secondo ha valutato prima la clausola where.

2

È possibile fare riferimento MSDN

Le righe selezionate da una query vengono filtrati prima dalla clausola FROM unirsi condizioni, poi le condizioni di ricerca WHERE clausola, e poi i AVENTI condizioni di ricerca clausola. I join interni possono essere specificati in o nella clausola FROM o WHERE senza influire sul risultato finale.

È inoltre possibile utilizzare il SET SHOWPLAN_ALL ON prima di eseguire la query per mostrare il piano di esecuzione della query in modo che si può misurare la differenza di prestazioni in due.

4

ordine logico di fasi di lavorazione interrogazione è:

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

È possibile avere fino a condizioni anche sul vostro JOIN s o WHERE clausole. Come:

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

è possibile fare riferimento a questo join optimization

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

Il nidificato-loop join algoritmo sarebbe eseguire questa query nel modo seguente:

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; 
     } 
    } 
    } 
}