2009-08-05 12 views
2

2つのテーブルを結合するとき、以下の2つのブロックの違いは何ですか?あなたはどのSQLを書いていますか?

パターンA:

SELECT ... 
FROM A 
    INNER JOIN B 
     ON A.PK = B.FK 
WHERE 1=1 
    AND A.Name = "Foo" 
    AND B.Title = "Bar" 

パターンB:

SELECT ... 
FROM A 
    INNER JOIN B 
     ON A.PK = B.FK 
      AND B.Title = "Bar" 
WHERE 1=1 
    AND A.Name = "Foo" 
+2

私はクエリオプティマイザがあまり気にしないと思うでしょう。しかし、私は指導者ではありません。 – balpha

+0

@balpha:それは* INNER *結合だけに当てはまります。 OUTER結合には違いがあります。 – Sung

答えて

13

これは人から人へと異なるために起こっているが、私はそのパターンAが優れていると思います。

これは、テーブルレベルの結合をフィルタから分離することです。これは、複数の結合と複数のフィルタを持つクエリに役立つ可能性があります。これは、実行中の2つのタイプの結合をはっきりと区別するためです。

+0

正確に。 ONはもともとフィルタから結合条件を分離するために導入されました。 – Powerlord

4

私はパターンAを好みますが、おそらく違いはありません。実行計画が効率的に実行されていることを確認するには、実際に実行計画を確認する必要があります。

0

私は間違っているかもしれませんが、私はより効率的なものとして第1のアプローチを見ています。あなたのクエリーはインサイドアウトで実行されます。だからあなたが最初にあなたのジョインを動かすと、速く走るでしょう。ちょうどそれが(おそらく索引付けされた)PK & FK Fieldsにマッチしなければならず、あなたのTitleフィールドのような無関係なものではありません。ですから、where句をフィルタリングするときには、マッチングを実行するデータが少なくなります。しかし、総投機。私は他人が何を言っているのだろうか。この実行計画を見て傷ついてはいけないでしょう:)

+1

良いクエリエンジンと組み合わされた場合、クエリをどのように書き込むかは、クエリの実行方法と相関してはいけません。これは、より巧妙ではない古いクエリエンジンでは当てはまりました。 –

3

INNER JOINOUTER JOINに置き換えた場合、違いがあります。

そうでない場合は、これらのクエリ:

SELECT ... 
FROM A 
INNER JOIN 
     B 
ON  A.PK = B.FK 
WHERE A.Name = "Foo" 
     AND B.Title = "Bar" 

SELECT ... 
FROM A 
INNER JOIN 
     B 
ON  A.PK = B.FK 
     AND B.Title = "Bar" 
WHERE A.Name = "Foo" 

SELECT * 
FROM A, B 
WHERE B.Title = "Bar" 
     AND A.Name = "Foo" 
     AND A.PK = B.FK 

は同じです。

OracleMySQLPostgeSQLおよびSQL Serverは、それらを全く同じように扱い、すべてについて全く同じ計画を使用します。

私はこの1つを使用したい:(B.FK, B.title)上の複合キーがある場合

SELECT ... 
FROM A 
INNER JOIN 
     B 
ON  B.FK = A.PK 
     AND B.Title = "Bar" 
WHERE A.Name = "Foo" 

B.FK上の単一列のキー、およびこの1つが存在する場合

SELECT ... 
FROM A 
INNER JOIN 
     B 
ON  B.FK = A.PK 
WHERE A.Name = "Foo" 
     AND B.Title = "Bar" 

を。

この場合、結合条件はより視覚的です。

+0

最初のパターンとして外部結合を使用し、外部結合を内部結合に変換し、第2の結合を内部結合に変換しないと、結果が大きく異なることになります。 – HLGEM

関連する問題