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
.
Być może pomogłoby to: http://stackoverflow.com/questions/879893/sql-order-of-operations –
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ć". –
To pomoże: http://stackoverflow.com/questions/19477950/ są-wewnętrzne-dołączenie-i-zewnętrzne-konieczne-złączenie/19478161 # 19478161 – Deepshikha