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
.
Forse questo sarebbe di aiuto: http://stackoverflow.com/questions/879893/sql-order-of-operations –
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" –
Questo aiuterà: http://stackoverflow.com/questions/19477950/ sono-inner-join-and-outer-join-necessaria/19478161 # 19478161 – Deepshikha