3 に答える
いいえ、JOIN オーダーを並べ替えてもパフォーマンスに影響はありません。MSSQL (他の DBMS と同様) にはクエリ オプティマイザーがあり、その仕事は、特定のクエリに対して最も効率的なクエリ プランを見つけることです。一般に、これらは非常にうまく機能するため、オプティマイザを簡単に打ち負かすことはまずありません。
とはいえ、彼らは時々それを間違えます。そこで、実行計画を読み取ることが重要になります。JOIN ヒントを追加して、テーブルを結合する方法を MSSQL に伝えることができます (この時点で順序が重要になります)。通常は、最小のテーブルから最大のテーブルの順に並べ (ただし、 を使用するとFULL JOIN
、あまり問題にならない可能性があります)、結合タイプの経験則に従います。
あなたがやっているのでFULL JOINS
、基本的にディスクから4つのテーブル全体を読んでいます。それはおそらく非常に高価です。問題を再検討し、別の方法で解決できるかどうかを確認することをお勧めします。
- ⋈ の順序を変えると結果は変わるでしょうか?
いいえ、順序は関係ありFULL JOIN
ません。結果は同じになります。ただし、次のようなものは使用できないことに注意してください (次の例では、結合の順序によって結果が異なる場合があります)。
SELECT
COALESCE(a.id, b.id, c.id, d.id) AS id, --- Key columns used in FULL JOIN
a.*, b.*, c.*, d.* --- other columns
FROM a
FULL JOIN b
ON b.id = a.id
FULL JOIN c
ON c.id = a.id
FULL JOIN d
ON d.id = a.id ;
次のようなものを使用する必要があります(結合の順序に関係なく、結果に違いはありません):
SELECT
COALESCE(a.id, b.id, c.id, d.id) AS id,
a.*, b.*, c.*, d.*
FROM a
FULL JOIN b
ON b.id = a.id
FULL JOIN c
ON c.id = COALESCE(a.id, b.id)
FULL JOIN d
ON d.id = COALESCE(a.id, b.id, c.id) ;
- ⋈ 結合の順序を変更すると、パフォーマンスに違いが生じますか?
2 番目と 3 番目の結合は、列自体ではなく、列に対して実行する必要があることを考慮するとCOALESCE()
、インデックスを効果的に使用できるかどうかは、十分な大きさのテーブルでテストするだけでわかると思います。
完全外部結合の順序を変更しても、パフォーマンスや結果には影響しません。Full Outer Join の順序に基づいて影響を受ける唯一のものは、SELECT * を使用した場合に生成される列のデフォルトの順序です。大きなテーブルで複数の結合を実行しようとするだけで、パフォーマンスの問題が発生する場合があります。テーブルを制限する where 句がない場合、何十万もの結果が表示される可能性があります。