SQLServer【Index編】#S2_08_非クラスター化インデックスの作成

当サイトではアフィリエイト広告を利用しています。

それでは今回は「非クラスター化インデックス」を作成していきます。

非クラスター化インデックスの作成

それでは非クラスター化インデックスの作成をしていきましょう。「IndA」の階層を開き,「テーブル」「Shain」の順に開いていきます。そうすると,その中に「インデックス」というフォルダーがあります。これも開いてもらうと,中には何も入っていないことが分かります。つまり,現状「Shain」テーブルには「インデックス」は存在しないという意味です。

インデックスのフォルダーを右クリックして,「新しいインデックス」を選択し,「非クラスター化インデックス」をクリックします。

「新しいインデックス」の画面が表示されたら,まず「インデックス名」のところを,「NonClusteredIndex-Id」という名前にします。今回は「Id」での非クラスター化インデックスを作成するのでこういった名前にしました。実際現場で命名する場合は,現場の命名規約に合わせた名前を付けてください。

次に「インデックスキー列」のタブが選択されている状態で「追加」ボタンをクリックします。

列の選択画面が表示されるので,「Id」のチェックボックスにチェックを入れて「OK」ボタンを押下します。

すると最初の画面に「Id」の列が追加された状態になるので,「OK」ボタンを押下し,非クラスター化インデックスを作成します。

これで,「インデックス」フォルダーの中に,非クラスター化インデックスが作成されたことが確認できます。

検索条件ありで検索を実行

非クラスター化インデックスが作成された状態で,もう一度以前実施していた「Id=1」の検索条件で検索を実行してみます。

DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE
select * from Shain
where Id = 1

すると,以前は12秒かかっていた検索が,1秒未満で完了しました。

実行プランの確認

前回まではTableScanになっていましたが,今回は状況が変わっています。

IndexSeek

まず,IndexSeekになっているところに注目してください。

「Seek」とは「ピンポイントでデータを見つけました」という意味です。IndexSeekなので,「インデックスを使って,ピンポイントでデータを見つけた」という意味になります。いままでは「TableScan」でした。スキャンは「全部読んだ」という意味なのですが,「Seek」はピンポイントで見つけたという事なので,インデックスがうまく機能したという事です。

ScanかSeekか?

先述の通り,インデックスが機能しているかどうかをチェックする場合は,「Scan」か「Seek」のどちらなのかに注目してください。Scanなら全部読んだ,Seekならピンポイントで見つけられたという事なので,基本的には「Seek」になっていれば成功という事です。

RIDLookup

実行プランにはIndexSeekのほかに「RIDLookup」というものも存在します。

これは,非クラスター化インデックスの内部構造が分からないと,理解ができないと思うので,次回,非クラスター化インデックスの内部構造を解説する時に一緒に解説します。

次回は非クラスター化インデックスの内部構造を解説するなかで,IndexSeekがどういった動作なのか,そして,RIDLookupがどういった動作をしているのか?という事を解説していきます。