2016-08-06 9 views
1

Nehmen wir an, wir haben eine Verbindung zwischen t1 und t2, wie folgt aus:Ist ein "Ein" Kriterium schneller als ein "Wo"?

select c1, ..., cn 
from t1 join t2 
on t1.fk = t2.k 
join t3 
on t2.fk = t3.k 
where (some condition independent from t3) 

wo (some condition independent from t3) alles sein könnte. Betrachten Sie nun diese Abfrage:

select c1, ..., cn 
from t1 join t2 
on t1.fk = t2.k and (some condition independent from t3) 
join t3 
on t2.fk = t3.k 

lassen Sie uns annehmen, dass t1 x t2 x t3 zusammen mit den join Bedingungen führt in count1 Reihen, während, wenn wir auch durch die where Bedingung filtern, dann werden wir count2 Datensätze haben, wo count2 < = count1.

Ich frage mich, ob die where Bedingung für alle count1 Zeilen ausgeführt wird, oder nur auf die Teilmenge der count2 Zeilen? Ist es in Bezug auf die Leistung besser, die Bedingungen so schnell wie möglich in die On-Bedingungen aufzunehmen oder sie am Ende der Abfrage anzuhängen?

+1

Sie sollten gleich sein. Der SQL-Optimierer sucht nur nach Filterbedingungen, nicht nach deren Definition. Hinweis: Bei äußeren Joins kann die Semantik je nach den Bedingungen unterschiedlich sein. –

Antwort

0

Es macht keinen Unterschied. Sehen Sie sich die tatsächlichen Ausführungspläne an. Sie werden sehen, dass sie gleich sind.

In SQL Server Management Studio: Abfrage -> Include Actual Ausführungsplan

+0

Können Sie die Ausführungspläne für alle unendlich viele mögliche Abfragen überprüfen, über die wir sprechen? –

+0

@LajosArpad Ja kann ich;) Sie können über den SQL-Optimierer in der Dokumentation lesen. Es zerlegt die SQL-Anweisung und behandelt alle Filterbedingungen auf die gleiche Weise. –

+0

Ist Ihre Aussage auch für linke Joins gültig? –

Verwandte Themen