2009-12-15 5 views
11

In SQL (MSSQL, Oracle usw., was auch immer), was ist der Vorteil beim Hinzufügen von Filtern zu der JOIN-Anweisung, anstatt sie in der WHERE-Klausel zu haben?Filterung mit dem JOIN anstelle von WHERE

dh

SELECT * FROM X INNER JOIN Y ON X.A = Y.A WHERE X.B = 'SOMETHING' 

gegen

SELECT * FROM X INNER JOIN Y ON X.A = Y.A AND X.B = 'SOMETHING' 

Mir ist klar, dass dies nicht in allen Fällen funktioniert, aber ich habe bemerkt, dass die, indem sie eine Leistungssteigerung zu sein, in einigen Fällen erscheint Filterkriterien in der JOIN-Anweisung. Da es jedoch Teil der JOIN-Anweisung ist, kann es auch dazu führen, dass es sich etwas seltsam verhält.

Gedanken?

+0

Duplizieren: http://stackoverflow.com/questions/1018952/condition-within-join-or-where –

Antwort

5

Für INNER JOIN Abfragen hängen die Leistungsmerkmale dieser Filter von vielen Faktoren ab - von der Größe der Tabellen, der Indexierung, der Selektivität der Abfrage und anderen Faktoren, die für das RDBMS, auf dem die Abfrage ausgeführt wird, spezifisch sind.

In LEFT und RIGHT OUTER JOIN die Position der Filterfragen viel mehr als INNER JOIN, wirkt da, ob es vor angewandt wird (JOIN Klausel) oder nach (WHERE Klausel) die Verbindung erfolgt.

+2

Mit anderen Worten, einschließlich Der Filter in der ON-Klausel eines OUTER JOIN könnte (wird) andere Ergebnisse hervorbringen, als wenn er in die WHERE-Klausel aufgenommen würde. – APC

+1

Das Einfügen eines Gleichheitsfilters in die 'WHERE'-Klausel des 'OUTER JOIN' macht es effektiv zu' INNER JOIN'. – Quassnoi

5

Ich mache das manchmal in Abfragen, die viele Joins haben, weil es alle Informationen über den Join in einem Teil der Abfrage lokalisiert, anstatt einige in der Join-Bedingung und einige in der Where-Klausel.

+2

Das ist auch, wie ich es verwende: separates Modell (Join) von Auswahl (wo) – lexu

3

Für einen INNEREN JOIN, würde ich keinen Leistungsunterschied erwarten, aber eher, dass der gleiche Plan verwendet würde, ob der Filter in der JOIN ... ON-Klausel oder der WHERE-Klausel war. Ich persönlich bevorzuge es, die Join-Kriterien in der JOIN-Klausel und die Filterung in der WHERE-Klausel zu schreiben - eine Art, alle "Parameter" am selben Ort an die SQL-Anweisung anzuhängen - das ist nicht unbedingt sinnvoll oder gut - durchdacht. Umgekehrt möchten manche Leute in der JOIN-Klausel alles haben, um alles zusammenzuhalten.

Die Situation mit Outer Joins ist anders - es gibt einen signifikanten Unterschied zwischen "a LINK OUTER JOIN b ON a.a_id = b.a_id AND b.type = 1" und "a LINK OUTER JOIN b ON a.a_id = b.a_id WHERE b.type = 1 "- Letzteres erzwingt implizit einen inneren Join. Dies wäre ein weiterer Grund, alle diese Bedingungen aus Konsistenzgründen in die JOIN-Klausel aufzunehmen.

2

Diese Syntaxen sind synonym und sind für die gleiche Sache von den meisten RDBMS optimiert.

Ich ziehe es in der Regel diese Syntax:

SELECT * 
FROM X 
INNER JOIN 
     Y 
ON  X.A = Y.A 
WHERE X.B = 'SOMETHING' 

wenn B kein Teil der logischen Verbindung zwischen A und B, und diese:

SELECT * 
FROM X 
INNER JOIN 
     Y 
ON  X.A = Y.A 
     AND X.B = 'SOMETHING' 

wenn es ist.

0

Nichts, außer Klarheit und Bedeutung. Es sei denn, Sie haben äußere Verbindungen.

0

als Mensch (und nicht als Optimierer) selbst, wenn eine Abfrage Aufrechterhaltung ich für eine Join-Bedingung in der JOIN Klausel und eine Suchbedingung in der WHERE Klausel aussehen würde.

Natürlich müssen Sie ein Gleichgewicht zwischen Leistungsproblemen und Codepflegeproblemen finden. Meine erste Priorität ist jedoch in erster Linie ein guter logischer Code, der dann bei Bedarf optimiert wird.