前回は非クラスター化インデックスの内部構造を解説し,その中でIndexSeekやRIDLookupの動作をご説明しました。
他の項目での検索
現状はIdに対してはインデックスを作成しましたが,それ以外の項目には入れていないので,それ以外の項目で検索すると,当然,当初の全件検索の時と同じようにTableScanになります。
例えばCreateDateの項目を「Id=1」の行のCreateDate「2010-07-23 12:19:45.000」で検索してみましょう。
1 2 3 4 |
DBCC DROPCLEANBUFFERS DBCC FREEPROCCACHE select * from Shain where CreateDate = '2010-07-23 12:19:45.000' |
私の環境では17秒くらいかかりました。
推定コスト
実行プランを開くと,予想通りTableScanになっています。
あと,TableScanと書かれているあたりにカーソルをかざすと,詳細情報を見ることができます。見どころとしては「推定コスト」を見ます。ここの値が低ければ低いほどいいです。I/Oの推定コストはどれだけファイルにアクセスしたかであり,CPUの推定コストとの合計が操作の推定コストになります。
Id指定時の推定コスト
Id指定のSQLを実行した際の実行プランを表示し,推定コストを見ると,明らかにTableScanをしたときより,コストが低いことが分かります。
インデックスの無効化
現状は「Id」に非クラスター化インデックスを作成したので,高速に検索ができるようになっていますが,インデックスを無効化することもできます。
インデックスフォルダーの中の,非クラスター化インデックスを右クリックし,「無効化」を選択します。
インデックスの無効化画面が表示されるので,「OK」を押下すると,無効化されます。
この状態でId指定の検索を行ってみてください。インデックスが無かった時と同じように,検索が遅くなるのが分かります。実行プランもTableScanになっていることが確認できます。
インデックスの復活
インデックスを復活させる時は「再構築」を選択します。
インデックスの再構築画面で「OK」を押下すると,インデックスが復活します。
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_インデックスの注意点
おわりに