前回まででクラスター化インデックスと非クラスター化インデックスの解説を行いました。基本的にインデックスはこの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だけがある,純粋な非クラスター化インデックスだけで構成するほうが,インデックスは軽量なので,どうしても非クラスター化インデックスだけでは速度が出ない場合につかうようにしてください。
C#を正しい3層構造で造れてますか?
無料動画コース「C#のアーキテクチャー」(80分)をプレゼントしています
#S1_01_はじめに
#S1_02_インデックスとは
#S1_03_インデックスの有無実演
#S1_04_SQLServerのインストール
#S2_01_データベースとテーブルの作成
#S2_02_データの作成
#S2_03_全件検索
#S2_04_キャッシュとは
#S2_05_検索条件ありで検索
#S2_06_テーブルスキャンとは
#S2_07_インデックスの種類
#S2_08_非クラスター化インデックスの作成
#S2_09_非クラスター化インデックスの内部構造
#S2_10_インデックスのない列の検索とインデックスの有効化無効化
#S2_11_クラスター化インデックスの作成
#S2_12_クラスター化インデックスの内部構造
#S2_13_クラスター化インデックスの検索
#S2_14_インデックスの検索補足
#S2_15_付加列インデックス
#S2_16_プライマリキーとユニークキー
#S2_17_インデックス作成手順
#S2_18_インデックスの注意点
おわりに