More Related Content
Similar to Index tuning (20)
Index tuning
- 13. ■経験談(ご参考程度だが、とても重要)
①「SELECT *」を使う場合、クラスタインデックスは非クラスタインデックスより性能がい
い。
②「Clustered Index Scan」、「Index Scan」が出ている場合、「SELECT *」をや
めるか、WHERE条件を追加する。
③「Nested Loops」が多く出ている場合、クラスタインデックスの定義を見直すか、非ク
ラスタインデックスのインクルード列に対象列の漏れはあるかどうかの確認。
④「RID Lookup」や「Key Lookup」が出る場合、非クラスタインデックスの見直しとイ
ンクルード列に対象の漏れはあるかどうかの確認。
⑤「Hash Match」が出る場合、左側のJoinの対象サイズは右側のJoinの対象サイズよ
り小さくすべき、もっと小さくするべき。左右が逆転の場合、性能が落ちる。
⑥「Merge Join」が出る場合、左右の対象がすでに同じキーでソート済みかどうか、ソー
トするために、クラスタインデックスを使う手もある。
⑦使いたいインデックスを使ってくれない場合、インデックス指定して、クエリを実行する。
⑧パラメータによって、実行プランが変わったりして、パフォーマンス低下の場合、パラ
メータヒントを使い、クエリを実行する。
⑨無駄な集計やソートはあるかどうかの確認。
⑩インデックス統計情報は古いかどうかの確認。
⑪インデックスの断片化の確認。
SQL Serverのクエリ実行プランとパフォーマンス
–クエリインデックスチューニング
- 14. ■クエリ実行プランにやさしいT-SQL書き方、注意点(あくまで一部)
①データベースオブジェクトを指定する時はスキーマ名(所有者)をつける
EX)
select x from [dbo].[t1]
execute [dbo].[proc_1] @p = 1
理由:スキーマ名をつけることで、実行プランの再利用が促進される。
②select *(アスタリスク)の利用を控える
理由:インデックスからヒープを参照する操作がなくなり、I/Oやロックが減少し、パフォー
マンスが向上する。
③not 条件で検索を可能な限り避ける
not、!=、<>、!>、!<、not exists、not in、not like
理由:スキャンを誘発する可能性が高い。Or条件は多数連結される表現も同じ。not inを
使うより、not existsのほうがまだ増し。
④暗黙的なデータ変換はやめよう
理由:有効なインデックスが存在してもスキャンを発生させる可能性が高い。cast、
convert関数を使って明示的に書く。
EX)
where person_cd = 100 → where person_cd = ‘100’
SQL Serverのクエリ実行プランとパフォーマンス
–クエリインデックスチューニング