SqlServerではカバリングインデックスの欠点を補うものとして
付加列インデックスというものがある。
まず、カバリングインデックスとは非クラスタ化インデックスを応用したものである。
通常の非クラスタ化インデックスは主に検索条件に使用する項目につけるが
SELECTの列もインデックスに含めることによりクエリをインデックス内だけで完結するようし、
データページへのアクセスを減らす手法のこと。
以下のようなSQLをカバリングインデックスで処理しようとした場合、
SELECT col_1,col_2,col_3 FROM tbl_hoge WHERE col_3 = 'harada'
CREATE INDEX idx1_hoge ON tbl_hoge(col_3,col_1,col_2)
上記の場合、col_1,col_2は抽出条件ではないがインデックスに含めることにより
インデックス内だけでデータが取得できるようになる。
ただし、SELECTの項目をインデックスに含めてしまうとその分サイズが大きくなってしまう。
それを解消するのが付加列インデックスである。
カバリングインデックスではtreeの階層が深くなると検索条件ではないがインデックス付加した列も
中間ページにも含まれてしまいサイズが増大する。
しかし、付加列インデックスでは末尾のリーフページにしか付加した列が作成されない。
これによってサイズの増加を防ぐことができる。
なお、中間ページに含まれないということは抽出条件にその列が含まれても検索は高速化されない。
作成方法は以下の通り。includeオプションに付加する列を指定する。
CREATE INDEX idx1_hoge ON tbl_hoge(col_3)include(col_1,col_2)
動作確認環境:SqlServer 2008 Express