インデックス

SQLServer【Index編】#S2_10_インデックスのない列の検索とインデックスの有効化無効化

前回は非クラスター化インデックスの内部構造を解説し,その中でIndexSeekやRIDLookupの動作をご説明しました。

他の項目での検索

現状はIdに対してはインデックスを作成しましたが,それ以外の項目には入れていないので,それ以外の項目で検索すると,当然,当初の全件検索の時と同じようにTableScanになります。

例えばCreateDateの項目を「Id=1」の行のCreateDate「2010-07-23 12:19:45.000」で検索してみましょう。

私の環境では17秒くらいかかりました。

推定コスト

実行プランを開くと,予想通りTableScanになっています。

あと,TableScanと書かれているあたりにカーソルをかざすと,詳細情報を見ることができます。見どころとしては「推定コスト」を見ます。ここの値が低ければ低いほどいいです。I/Oの推定コストはどれだけファイルにアクセスしたかであり,CPUの推定コストとの合計が操作の推定コストになります。

Id指定時の推定コスト

Id指定のSQLを実行した際の実行プランを表示し,推定コストを見ると,明らかにTableScanをしたときより,コストが低いことが分かります。

インデックスの無効化

現状は「Id」に非クラスター化インデックスを作成したので,高速に検索ができるようになっていますが,インデックスを無効化することもできます。

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

インデックスの無効化画面が表示されるので,「OK」を押下すると,無効化されます。

この状態でId指定の検索を行ってみてください。インデックスが無かった時と同じように,検索が遅くなるのが分かります。実行プランもTableScanになっていることが確認できます。

インデックスの復活

インデックスを復活させる時は「再構築」を選択します。

インデックスの再構築画面で「OK」を押下すると,インデックスが復活します。

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