6
4

3 に答える 3

8

いいえ、JOIN オーダーを並べ替えてもパフォーマンスに影響はありません。MSSQL (他の DBMS と同様) にはクエリ オプティマイザーがあり、その仕事は、特定のクエリに対して最も効率的なクエリ プランを見つけることです。一般に、これらは非常にうまく機能するため、オプティマイザを簡単に打ち負かすことはまずありません。

とはいえ、彼らは時々それを間違えます。そこで、実行計画を読み取ることが重要になります。JOIN ヒントを追加して、テーブルを結合する方法を MSSQL に伝えることができます (この時点で順序重要になります)。通常は、最小のテーブルから最大のテーブルの順に並べ (ただし、 を使用するとFULL JOIN、あまり問題にならない可能性があります)、結合タイプの経験則に従います。

あなたがやっているのでFULL JOINS、基本的にディスクから4つのテーブル全体を読んでいます。それはおそらく非常に高価です。問題を再検討し、別の方法で解決できるかどうかを確認することをお勧めします。

于 2012-05-21T12:18:43.470 に答える
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()、インデックスを効果的に使用できるかどうかは、十分な大きさのテーブルでテストするだけでわかると思います。

于 2012-05-21T12:16:11.637 に答える
0

完全外部結合の順序を変更しても、パフォーマンスや結果には影響しません。Full Outer Join の順序に基づいて影響を受ける唯一のものは、SELECT * を使用した場合に生成される列のデフォルトの順序です。大きなテーブルで複数の結合を実行しようとするだけで、パフォーマンスの問題が発生する場合があります。テーブルを制限する where 句がない場合、何十万もの結果が表示される可能性があります。

于 2012-05-21T11:48:20.527 に答える