インデックス

SQLServer【Index編】#S2_15_付加列インデックス

前回まででクラスター化インデックスと非クラスター化インデックスの解説を行いました。基本的にインデックスはこの2つを使えばいいのですが,非クラスター化インデックスだけではどうしてもパフォーマンスが出ない場合に使用する「付加列インデックス」というものを解説します。

現状Idの非クラスター化インデックスの終端であるリーフページには,「Id」と「CreateDate」で構成されているため,「Id」と「CreateDate」だけでSelectする場合はキー参照が発生せずに高速に検索ができるというお話をしました。

Meiを入れるとキー参照が発生する

非クラスター化インデックスのリーフページに存在しない「Sei」や「Mei」などの項目をSelectすると,キー参照が発生し,検索は遅くなります。

付加列インデックスの必要性

非クラスター化インデックスのリーフページに「Mei」が無いから遅いのであれば,「そこにMeiも入れておこう!」というのが付加列インデックスの考え方です。リーフページに無いからキー参照が発生し,遅いのであれば,「そこにMeiもあればいいじゃん!!」という発想です。

付加列インデックスの作成

というわけで,付加列インデックスを作成してみましょう。非クラスター化インデックスを作成した時と途中までは同じです。まずは「新しいインデックス」から「非クラスター化インデックス」を選択します。

インデックス名

インデックス名を「NonClusteredIndex-IdFukaretu」としておきます。

インデックスキー列の追加

「インデックスキー列」が選択されている状態で「追加」を押します。

「Id」にチェックを入れて「OK」ボタンを押下します。ここまでは非クラスター化インデックスを作成した時と全く同じです。

含まれている列の追加

続けて,「含まれている列」を選択し「追加」ボタンを押下します。

ここで非クラスター化インデックスのリーフページに入れておきたい「列」を選択します。今回は「Sei」と「Mei」を入れておきましょう。

「Sei」と「Mei」が選択されていることを確認して,「OK」ボタンを押下します。

これでIdの非クラスター化インデックスに付加列インデックスとして「Sei」と「Mei」が追加されたので,リーフページには「Id」「CreateDate」「Sei」「Mei」の4つの項目で構成されていることになります。

Meiを指定してSelect

というわけで,Select文に「Id」「CreateDate」「Mei」を指定して,再度検索をしてみましょう。結果はIndexSeekのみで,キー参照は発生していません。試しに「Sei」をSelect文に追加しても結果は同じです。ただし,当然「Tel」などのリーフページに存在しない項目でSelect文を実行すると,またキー参照が発生します。試しに実行してみてください。

付加列インデックスの注意点

このように付加列インデックスを使えば,簡単に速度アップが見込めますが,あまり安易に使わないほうがいいです。ご説明した内部構造上,付加列インデックスは,完全にデータの2重持ちであり,本来は必要のないデータ容量を使用するため,無くていいならないほうがいいのです。本来はIdで検索する時は「Id」とクラスター化インデックスのKeyだけがある,純粋な非クラスター化インデックスだけで構成するほうが,インデックスは軽量なので,どうしても非クラスター化インデックスだけでは速度が出ない場合につかうようにしてください。

SQLServerインデックスを理解して検索を高速にする方法