WHERE句とは対照的に、結合でフィルタリングを行うためのパフォーマンス上の議論はありますか?
例えば、
SELECT blah FROM TableA a
INNER JOIN TableB b
ON b.id = a.id
AND b.deleted = 0
WHERE a.field = 5
とは対照的に
SELECT blah FROM TableA a
INNER JOIN TableB b
ON b.id = a.id
WHERE a.field = 5
AND b.deleted = 0
フィルタリングはフィルタリングセクション(WHERE)で実行する必要があると思うので、個人的には後者の方が好きですが、どちらの方法でもパフォーマンスやその他の理由はありますか?
クエリオプティマイザがその仕事をする場合、内部結合の2つの形式にまったく違いはありません(他の人の明快さを除いて)。
とは言うものの、左結合では、結合の条件は、結合する前に2番目のテーブルから行をフィルターで除外することを意味します。 whereの条件は、結合後に最終結果から行を除外することを意味します。それらは非常に異なることを意味します。
クエリの論理処理では、WHERE
は常にfilterclause(ON)の直後に配置されるため、これら2つの間に違いはありません。例では次のようになります。
例はANSISQL-92標準であり、次のようにANSISQL-89標準でクエリを作成することもできます。
SELECT blah FROM TableA a,TableB b
WHERE b.id = a.id AND b.deleted = 0 AND a.field = 5
これIS内部結合の場合はTRUE、外部結合の場合IS同様ですが、同じではありません
内部結合を使用すると、同じ結果とおそらく同じパフォーマンスが得られます。ただし、外部結合を使用すると、2つのクエリは異なる結果を返し、where句に条件を設定すると、本質的にクエリが左結合から内部結合に変更されるため、まったく同等ではありません(一部のレコードを探している場合を除く)フィールドがnull)。