SQL Server クラスター化インデックスの動作と実行プランについて
はじめに
SQL Server の検索速度を上げる方法にインデックスの利用があります。
今回は「クラスター化インデックス」についてまとめます。
学習に使用した資料は公式HPのSQL Server 2012 自習書シリーズになります。
SQL Server 2012 | マイクロソフト クラウド プラットフォーム
データベースは自習書シリーズに付属しているサンプルを使用しています。
詳細は以下の記事を参考にして下さい。
knkomko.hatenablog.com
動作環境
・Windows 10 (バージョン 1909)
・SQL Server 2017 Express
Download Microsoft® SQL Server® 2017 Express from Official Microsoft Download Center
・Microsoft SQL Server Management Studio 18
SQL Server Management Studio (SSMS) のダウンロード - SQL Server Management Studio (SSMS) | Microsoft Docs
クラスター化インデックスとは
ヒープ領域を使用せずに実データを物理的に並び替えたインデックスです。
インデックスを使用したSQLは最も検索が速い Clustered Index Seek または Clustered Index Scan の動作です。
引用 : インデックスの基礎とメンテナンス
非クラスター化インデックスとの違い
非クラスター化インデックスの検索は Indes Seek 後 RID Lookup が動作します。
クラスター化インデックスではヒープ領域を使用せずに実データを使用する事で RID Lookup が無くなる為、非クラスター化インデックスよりも検索が速いです。
クラスター化インデックスの注意点
1. 実データをインデックス内に格納するのでテーブル内で1つしか作成できない。
2. インデックス作成時に、実データの並び替えを行うため
非クラスター化インデックスを作成するよりも作成時間がかかる。
3. インデックス作成時に、実データ(ヒープ)を並び替えた結果を格納するための
作業領域としてテーブルサイズの約 1.5 倍の空き容量が必要になる。
4. インデックス作成時に、トランザクションログへの変更履歴も記録されるため
その分の空き容量も必要になる。
実行プランの動作
実行プランの動作については以下のスライドが参考になりました。
④Clusted Index Scan、⑤Clusted Index Seek はクラスター化インデックスを使用した場合にだけ動作します。
引用 : https://www.slideshare.net/ssuser89be8d/index-tuning-129457451/12
インデックスを使用しない場合の実行プラン
最も遅い「Table Scan」を行っています。
クラスター化インデックスを使用した場合の実行プラン
インデックスを姓列に作成します。
オブジェクトエクスプローラーから作成したインデックスが確認できます。
同じSQLを実行すると最も高速な検索「Culusted Index Seek」を行っています。
非クラスター化インデックスを使用した場合の実行プラン
検索に「Index Seek」「RID Lookup」を使用している事が分かります。
検索結果に該当するデータが大量にある場合の実行プラン
非クラスター化インデックスではインデックスが使用されませんでした。
LIKE文では295件のデータが該当し最も遅い「Table Scan」が行われました。
インデックスを使用していてもインデックスを利用しない検索が行われています。
knkomko.hatenablog.com
クラスター化インデックスを使った場合は最も速い検索「Clusted Index Seek」が使用されます。