web-dev-qa-db-ja.com

JOIN句またはwhere句、あるいはその両方にインデックスを設定しますか?

私のクエリが次のようになっているとしましょう:

SELECT t1, t2
FROM t1
  LEFT JOIN t2 ON (t1.id = t2.id AND t2.userid = @userid)
WHERE t1.enabled = 1 AND
      t1.startDate <= ??? AND 
      (t1.counter = -1 OR
       t2.counter IS NULL OR
       (t1.counter > t2.counter)

このテーブルには数十万行ある可能性があります。

このようなJOIN句にインデックスを付けることをお勧めしますか?

  t2.id t2.userid

Where句についてはどうですか?または、join句の方が重要ですか?

テストは重要だと思いますが、理論的には何をすべきでしょうか?

(これはSQL Server 2000用です)

6
user1361315

JOIN条件で使用される列(外部キー列)には常に非クラスター化インデックスを配置することをお勧めします。これはいくつかの点で役立ちます。JOIN操作はより高速になり、FK制約を適用する(親行を削除しようとしたときに子行がアタッチされているかどうかを確認する)ことも、これらのインデックスのメリットを享受します。

次に、システムのパフォーマンスを確認します。期待を下回る場合は、1つのインデックスを慎重に追加し、システム全体のパフォーマンスが向上するかどうかを確認してください。そうでない場合:インデックスを再度削除します。パフォーマンスに満足するまで繰り返します。 WHEREまたはORDER BY句で使用される列は、これらのインデックスの主要な候補ですが、インデックスを作成しないでください!インデックスがない場合よりもさらに悪いまったく。

キンバリーを参照The Queen of IndexingTrippの優れたブログ投稿- インデックス:できるからといって、そうする必要があるわけではない! そのトピックについて。

4
marc_s