それでは今回は「非クラスター化インデックス」を作成していきます。
非クラスター化インデックスの作成
それでは非クラスター化インデックスの作成をしていきましょう。「IndA」の階層を開き,「テーブル」「Shain」の順に開いていきます。そうすると,その中に「インデックス」というフォルダーがあります。これも開いてもらうと,中には何も入っていないことが分かります。つまり,現状「Shain」テーブルには「インデックス」は存在しないという意味です。
インデックスのフォルダーを右クリックして,「新しいインデックス」を選択し,「非クラスター化インデックス」をクリックします。
「新しいインデックス」の画面が表示されたら,まず「インデックス名」のところを,「NonClusteredIndex-Id」という名前にします。今回は「Id」での非クラスター化インデックスを作成するのでこういった名前にしました。実際現場で命名する場合は,現場の命名規約に合わせた名前を付けてください。
次に「インデックスキー列」のタブが選択されている状態で「追加」ボタンをクリックします。
列の選択画面が表示されるので,「Id」のチェックボックスにチェックを入れて「OK」ボタンを押下します。
すると最初の画面に「Id」の列が追加された状態になるので,「OK」ボタンを押下し,非クラスター化インデックスを作成します。
これで,「インデックス」フォルダーの中に,非クラスター化インデックスが作成されたことが確認できます。
検索条件ありで検索を実行
非クラスター化インデックスが作成された状態で,もう一度以前実施していた「Id=1」の検索条件で検索を実行してみます。
1 2 3 4 |
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がどういった動作をしているのか?という事を解説していきます。
■Udemyの無料コース「C#を勉強する順番(49分)」は今すぐここからご覧いただけます
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_インデックスの注意点
おわりに
C#でコードスニペットを使う方法