2011-02-09 10 views
9

WHERE句とは対照的に、結合のフィルタリングを行うためのパフォーマンス上の議論はありますか? Iは、フィルタリングは、フィルタリング部()で行わなければならないと感じたので、私が個人的に、後者を好む参加のフィルタリング?

SELECT blah FROM TableA a 
INNER JOIN TableB b 
ON b.id = a.id 
WHERE a.field = 5 
    AND b.deleted = 0 

に対向するが、任意の性能があるので、例えば

SELECT blah FROM TableA a 
INNER JOIN TableB b 
ON b.id = a.id 
AND b.deleted = 0 
WHERE a.field = 5 

いずれかの方法を実行するその他の理由はありますか?

+0

[JOINを使用している場合は[WHERE句vs ON]の複製(https://stackoverflow.com/questions/10297231/where-clause-vs-on-when-using-join)(はい、時間旅行は含まれますが一見一応良い答えがある) –

答えて

17

クエリオプティマイザがそのジョブを実行する場合、内部結合の2つの形式では違いはありません。

つまり、左結合では、結合の条件とは、結合する前に2番目のテーブルから行をフィルタリングすることを意味します。 「where」の条件は、結合後に最終結果から行をフィルタリングすることを意味します。それらは非常に異なるものを意味します。

+4

+1。差異を指摘するため –

+0

+1 SQLプロファイラは正確に同じ数の読み取りを報告します – kelloti

0

私は、これはあなたが探しているものだと思います>>SQL join: where clause vs. on clause

+0

質問が重複していると思われる場合は、それ自身の内容を提供しないリンクのみの回答を追加するのではなく、 –

0

ないクエリの論理的な処理では、WHEREは常に(ON)右フィルタ句の後になりますので、これら二つの間には違いが、ありませんあなたの例では、あなたが持っているでしょう:

  1. デカルト積(TableBのから行のTableAののx個の行数)
  2. フィルター
  3. (ON)。

あなたの例では、ANSI SQL-92標準であり、あなたもこのようなANSI SQL-89規格にクエリを書くことができ:OUTERはJOINS WITH INNERは、結合に

SELECT blah FROM TableA a,TableB b 
WHERE b.id = a.id AND b.deleted = 0 AND a.field = 5 

これが真であります同じではありません。

0

内部結合を使用すると、同じ結果が得られますが、おそらく同じパフォーマンスになります。しかし、外部結合の場合、2つのクエリは異なる結果を返し、条件をwhere句に入れると全く同じになりません。つまり、本質的にクエリを左結合から内部結合に変更します(ただし、フィールドはnullです)。

関連する問題