2016-05-04 7 views
0

Gibt es einen Leistungsunterschied beim Hinzufügen zusätzlicher Kriterien zur JOIN-Klausel, anstatt sie in die WHERE-Klausel einzufügen? Gibt es einen tatsächlichen funktionellen Unterschied (unterschiedliche Ergebnisse)? Ist einer aus anderen Gründen besser als der andere?Wo sind die Kriterien in einem Join?

Zum Beispiel:

SELECT * 
FROM MyTable1 mto 
JOIN MyTable2 mto2 ON mto1.key = mto2.key 
WHERE somefield = somevalue 

VS

SELECT * 
FROM MyTable1 mto 
JOIN MyTable2 mto2 ON mto1.key = mto2.key 
        AND somefield = somevalue 
+1

Sie könnten 'EXPLAIN PLAN' ausführen und sehen, ob es einen Unterschied gibt. –

Antwort

3

Für INNER JOIN, sind sie logisch äquivalent und die gleichen Ergebnisse erzielen. Ich würde erwarten, dass der Abfrageplaner identische Pläne für beide Abfragen generiert, aber es besteht die Möglichkeit, dass er mit einer komplex genug Abfrage wackelig tun könnte. Ich persönlich bin dieser Situation nicht begegnet, aber ich kann nicht ausschließen, dass der Optimierer seltsame Dinge tut.

So, für INNER JOIN s ist der Unterschied größtenteils Lesbarkeit. Wenn Sie jedoch vermuten, dass der Abfrageplaner einen seltsamen Plan generiert, versuchen Sie, die Abfrage zu ändern und die Abfragepläne zu vergleichen.

Für OUTER JOIN s, das ist eine andere Geschichte. Betrachten Sie die folgenden Abfragen statt:

SELECT * FROM MyTable1 mto 
LEFT JOIN MyTable2 mto2 on mto1.key = mto2.key 
WHERE mto2.somefield = somevalue 

VS

SELECT * FROM MyTable1 mto 
LEFT JOIN MyTable2 mto2 on mto1.key = mto2.key 
AND mto2.somefield = somevalue 

In diesem Fall Ihre WHERE Klausel wirkt über die rechte Tabelle einer LEFT OUTER JOIN. Die erste Abfrage zieht alle Ergebnisse aus den LEFT OUTER JOINund dann Filter diejenigen über die WHERE Klausel. Dies verwandelt die OUTER JOIN in eine INNER JOIN.

Auf der anderen Seite, die zweite Abfrage wird sowohl die Bedingungen als Teil der LEFT OUTER JOIN und Rück NULL für Aufzeichnungen behandeln, die beiden Bedingungen der ON Klausel nicht damit seine OUTER JOIN Natur Halt erfüllen.

Dies gilt auch für alle WHERE Bedingung über eine Spalte auf der linken Tabelle einer RIGHT OUTER JOIN.

Wenn die WHERE-Bedingung über einer Spalte in der linken Tabelle auf einer LEFT OUTER JOIN oder in der rechten Tabelle auf einer RIGHT OUTER JOIN war, wären die Ergebnisse nicht beeinträchtigt worden.

+1

Aaaaah Das macht jetzt viel mehr Sinn. Vielen Dank! – logixologist

+0

Wenn das 'somefield' Teil der' mto' Tabelle ist, bleiben die beiden gleichwertig; Nur wenn 'somefield' Teil der' mto2'-Tabelle ist, gibt es einen Unterschied/ein Problem. In der Frage, wo ein "Somefield" ist, ist nicht klar. –

+0

@ JonathanLeffler Korrekt, weshalb ich 'mto2.' in der Antwort vorangestellt habe. Aber du hast recht, ich sollte das klarer machen. – Siyual