281 Stimmen

Bedingung in JOIN oder WHERE

Gibt es einen Unterschied (Leistung, Best-Practice usw.) zwischen dem Einfügen einer Bedingung in die JOIN-Klausel und der WHERE-Klausel?

Zum Beispiel...

-- Condition in JOIN
SELECT *
FROM dbo.Customers AS CUS
INNER JOIN dbo.Orders AS ORD 
ON CUS.CustomerID = ORD.CustomerID
AND CUS.FirstName = 'John'

-- Condition in WHERE
SELECT *
FROM dbo.Customers AS CUS
INNER JOIN dbo.Orders AS ORD 
ON CUS.CustomerID = ORD.CustomerID
WHERE CUS.FirstName = 'John'

Welche bevorzugen Sie (und warum?)?

3voto

user3512680 Punkte 197

Ich stimme mit der zweithäufigsten Antwort überein, dass es einen großen Unterschied machen wird, wenn man LEFT JOIN o RIGHT JOIN . Die beiden folgenden Aussagen sind äquivalent. Sie können also sehen, dass AND Klausel wird ein Filter vor JOIN während die WHERE Klausel wird ein Filter nach JOIN .

SELECT *
FROM dbo.Customers AS CUS 
LEFT JOIN dbo.Orders AS ORD 
ON CUS.CustomerID = ORD.CustomerID
AND ORD.OrderDate >'20090515'

SELECT *
FROM dbo.Customers AS CUS 
LEFT JOIN (SELECT * FROM dbo.Orders WHERE OrderDate >'20090515') AS ORD 
ON CUS.CustomerID = ORD.CustomerID

2voto

marr75 Punkte 5638

Ich erkenne in der Regel Leistungssteigerungen, wenn ich in der Verknüpfung filtere. Vor allem, wenn Sie auf indizierte Spalten für beide Tabellen verknüpfen können. Sie sollten in der Lage sein, die logischen Lesevorgänge bei den meisten Abfragen zu reduzieren, was in einer Umgebung mit hohem Datenvolumen ein viel besserer Leistungsindikator ist als die Ausführungszeit.

Ich bin immer leicht amüsiert, wenn jemand sein SQL-Benchmarking zeigt und beide Versionen eines Sproc 50.000 Mal um Mitternacht auf dem Entwicklungsserver ausgeführt hat und die Durchschnittszeiten vergleicht.

0voto

Eric Punkte 7646

Joins sind meiner Meinung nach schneller, wenn man eine größere Tabelle hat. Der Unterschied ist aber nicht so groß, vor allem, wenn man mit einer kleineren Tabelle arbeitet. Als ich das erste Mal etwas über Joins lernte, wurde mir gesagt, dass die Bedingungen in Joins genauso sind wie die Bedingungen in der Where-Klausel und dass ich sie austauschbar verwenden könnte, wenn die Where-Klausel genau angibt, auf welche Tabelle die Bedingung angewendet werden soll.

-1voto

Jacob B Punkte 1937

Die Bedingung in die Verknüpfung aufzunehmen, scheint mir "semantisch falsch" zu sein, denn dafür sind JOINs nicht "da". Aber das ist eine sehr qualitative Frage.

Zusätzliches Problem: Wenn Sie von einer inneren Verknüpfung zu einer rechten Verknüpfung wechseln wollen, könnte die Bedingung innerhalb des JOIN zu unerwarteten Ergebnissen führen.

-7voto

Jeeno Shibu Punkte 3

Es ist besser, die Bedingung in den Join aufzunehmen. Die Leistung ist wichtiger als die Lesbarkeit. Bei großen Datensätzen ist das wichtig.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X