43

次の2つの例があります。

1.例(WHERE)

SELECT 1
  FROM table1 t1
  JOIN table2 t2 ON t1.id = t2.id
 WHERE t2.field = true

2.例(JOIN AND)

SELECT 1
  FROM table1 t1
  JOIN table2 t2 ON t1.id = t2.id AND t2.field = true

パフォーマンスの面でより速い方法は何ですか?あなたは何を好むか?

4

3 に答える 3

22

フィルタがJOIN機能的に条件に入った場合(つまり、フィルタだけでなく実際の結合条件である場合)、ONその結合の句に含まれている必要があります。

注目に値する:

  • 代わりにWHERE句に配置すると、結合がの場合はパフォーマンスが同じになりINNER、それ以外の場合はパフォーマンスが異なります。コメントで述べたように、とにかく結果が異なるので、それは実際には重要ではありません。

  • WHERE本当に条件であるときに句にフィルターを配置すると、OUTER JOIN条件の性質が暗黙的にキャンセルOUTERされます(「レコードがない場合でも参加する」)。これらのフィルターは、そもそも既存のレコードが存在する必要があることを意味します。例:

... table1 t LEFT JOIN table2 u ON ... AND t2.column = 5正しい

... table1 t LEFT JOIN table2 u ON ... 
WHERE t2.column = 5 

t2からのレコードが予期されていることをエンジンに通知するため、これは正しくありませt2.column = 5ん。これは外部結合に反します。これに対する例外は、次IS NULLのようなフィルターWHERE t2.column IS (NOT) NULLです(これは、実際には条件付き外部結合を構築するための便利な方法です)

  • LEFTRIGHT結合は暗黙的にOUTER結合です。

お役に立てば幸いです。

于 2013-03-18T18:11:39.450 に答える
7

JOIN通常、条件はフィルター条件から独立している必要があります。結合のルール(how)を。で定義しますON必要なものをでフィルタリングしますWHERE。パフォーマンスに関しては、すべてのエンジンとデザインに共通のルールはないため、走行距離は大きく異なります。

于 2013-03-18T18:10:24.903 に答える
0

より高速な方法は、フィルターをwhere句に配置することです。これは、フィルターをwhereで最初に、次に結合句で処理するため、フィルターを並べ替える必要がないためです。

于 2014-01-24T20:28:46.957 に答える