追加コスト 0 で行う SQL Server のパフォーマンス改善・ボトルネック解消 その11 | 野良エンジニアの足跡

追加コスト 0 で行う SQL Server のパフォーマンス改善・ボトルネック解消 その11

こんにちは、nagino です。


そろそろ終わりかなという本シリーズですが、今回はカバリングインデックス(& 付加列インデックス)についてです。


私は、カバリングインデックスも付加列インデックスも、どちらも目的と手法が同じですので、あわせてカバリングインデックスと呼んでしまうのですが、SQL Server としては付加列インデックスは技術的に異なり、またセールスポイントでもあるため、区別して呼称するようです。


● カバリングインデックス

SELECT 文で使用する全ての列を含んだインデックスを作成することで、データページにアクセスすることなくインデックスページのみのアクセスで処理を行うことが出来、結果 Key Lookup によるアクセス(得てしてランダムアクセス)が省かれ、パフォーマンスが改善します。


● 付加列インデックス

条件式で使用する全ての列を含んだインデックスに、SELECT 句で取得する列を付加列として加えたインデックスを用意することで、カバリングインデックスと同様のパフォーマンス改善を図ります。

さらに、一部の列は付加列とすることでインデックスの中間ページに含まれるデータが減少し、結果インデックスのページ数が減少することで、カバリングインデックスよりパフォーマンスの改善を図ります。


パフォーマンスが問題になっている SELECT 文に対してこれらのインデックスを用意することで、検索処理のパフォーマンス改善を図ることが出来ます。

ただしインデックスが増えますので、その分更新処理のパフォーマンスは劣化します。

また、インデックスに含まれる列の順番や、付加列とするかどうかなどを誤ると、これらのインデックスが使用されないため、パフォーマンス改善に結びつかないことがあります。


トランザクションのテーブルがコメント情報などサイズが大きい列を含んでいて、またそのような列を含まない一覧画面などがあるといったように特定列のみを取得する処理が多い場合、これらの列を含むインデックスを用意しておくことでパフォーマンス改善を図れます。