どのSQLを作成しますか?
-
22-07-2019 - |
質問
2つのテーブルを結合する場合、下の2つのブロックの違いは何ですか?また、どちらがより良いアプローチですか?
パターン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"
解決
これは人によって異なりますが、パターンAの方が優れていると思います。
それは、テーブルレベルの結合とフィルターを分離します。これは、進行中の2種類の結合を明確に分離するため、複数の結合と複数のフィルターを使用したクエリに役立ちます。
他のヒント
パターンAを好みますが、おそらく違いはありません。ただし、実行プランを効率的に実行するには、実行プランを確認する必要があります。
INNER JOIN
を OUTER 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
同一です。
Oracle
、 MySQL
、 PostgeSQL
、および SQL Server
は、これらをまったく同じものとして扱い、まったく同じものを使用しますそれらすべてを計画します。
これを使用します:
SELECT ...
FROM A
INNER JOIN
B
ON B.FK = A.PK
WHERE A.Name = "Foo"
AND B.Title = "Bar"
B.FK
に単一列キーがあり、これが次の場合:
SELECT ...
FROM A
INNER JOIN
B
ON B.FK = A.PK
AND B.Title = "Bar"
WHERE A.Name = "Foo"
(B.FK、B.title)
に複合キーがある場合。
この場合、結合条件はより視覚的になります。
これについては間違っているかもしれませんが、1番目のアプローチはより効率的なアプローチだと思います。クエリはインサイドアウトで実行されます。したがって、最初に結合を実行すると、(おそらくインデックス付けされた)PK&で一致する必要があるため、より速く実行されます。 FKフィールド。タイトルフィールドのような無関係なものではありません(おそらくvarcharであり、一致をさらに遅くします)。したがって、フィルタリングwhere句に到達するまでに、マッチングを実行するデータが少なくなります。しかし、完全な推測。他の人が何と言うだろうか。これに関する実行計画を見るのに害はないでしょう:)