web-dev-qa-db-ja.com

参加をフィルタリングしますか?

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)で実行する必要があると思うので、個人的には後者の方が好きですが、どちらの方法でもパフォーマンスやその他の理由はありますか?

16
Craig

クエリオプティマイザがその仕事をする場合、内部結合の2つの形式にまったく違いはありません(他の人の明快さを除いて)。

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

28
btilly

クエリの論理処理では、WHEREは常にfilterclause(ON)の直後に配置されるため、これら2つの間に違いはありません。例では次のようになります。

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

例は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同様ですが、同じではありません

0
TheGodfather23

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

0
HLGEM