Grow up

生活とプログラミング

SQL Server クラスター化インデックスの動作と実行プランについて

はじめに

SQL Server の検索速度を上げる方法にインデックスの利用があります。
今回は「クラスター化インデックス」についてまとめます。
学習に使用した資料は公式HPのSQL Server 2012 自習書シリーズになります。
SQL Server 2012 | マイクロソフト クラウド プラットフォーム

データベースは自習書シリーズに付属しているサンプルを使用しています。
詳細は以下の記事を参考にして下さい。
knkomko.hatenablog.com

クラスター化インデックスとは

ヒープ領域を使用せずに実データを物理的に並び替えたインデックスです。
インデックスを使用したSQLは最も検索が速い Clustered Index Seek または Clustered Index Scan の動作です。
f:id:knkomko:20200411235632p:plain:w450
引用 : インデックスの基礎とメンテナンス

クラスター化インデックスとの違い

クラスター化インデックスの検索は Indes Seek 後 RID Lookup が動作します。
クラスター化インデックスではヒープ領域を使用せずに実データを使用する事で RID Lookup が無くなる為、非クラスター化インデックスよりも検索が速いです。

クラスター化インデックスとは

ヒープ領域に保存されている実データへのポインタを持つインデックスです。
そのためインデックスを使用したSQLは以下のように動作します。
①インデックスを検索する Index Seek の動作
②検索したインデックスのポインタを辿って実データを読む RID Lookup の動作

f:id:knkomko:20200405192048p:plain:w450
引用 : インデックスの基礎とメンテナンス
knkomko.hatenablog.com

クラスター化インデックスの注意点

1. 実データをインデックス内に格納するのでテーブル内で1つしか作成できない。

2. インデックス作成時に、実データの並び替えを行うため
 非クラスター化インデックスを作成するよりも作成時間がかかる。

3. インデックス作成時に、実データ(ヒープ)を並び替えた結果を格納するための
 作業領域としてテーブルサイズの約 1.5 倍の空き容量が必要になる。

4. インデックス作成時に、トランザクションログへの変更履歴も記録されるため
 その分の空き容量も必要になる。

実行プランの動作

実行プランの動作については以下のスライドが参考になりました。
④Clusted Index Scan、⑤Clusted Index Seek はクラスター化インデックスを使用した場合にだけ動作します。
f:id:knkomko:20200405220702p:plain:w350
引用 : https://www.slideshare.net/ssuser89be8d/index-tuning-129457451/12

インデックスを使用しない場合の実行プラン

最も遅い「Table Scan」を行っています。
f:id:knkomko:20200405222037p:plain:w350

クラスター化インデックスを使用した場合の実行プラン

インデックスを姓列に作成します。
f:id:knkomko:20200412001241p:plain:w350

オブジェクトエクスプローラーから作成したインデックスが確認できます。
f:id:knkomko:20200412001846p:plain:w250

同じSQLを実行すると最も高速な検索「Culusted Index Seek」を行っています。
f:id:knkomko:20200412002413p:plain:w350

クラスター化インデックスを使用した場合の実行プラン

検索に「Index Seek」「RID Lookup」を使用している事が分かります。
f:id:knkomko:20200405222727p:plain:w350

検索結果に該当するデータが大量にある場合の実行プラン

クラスター化インデックスではインデックスが使用されませんでした。

LIKE文では295件のデータが該当し最も遅い「Table Scan」が行われました。
インデックスを使用していてもインデックスを利用しない検索が行われています。
f:id:knkomko:20200405230312p:plain:w350
knkomko.hatenablog.com

クラスター化インデックスを使った場合は最も速い検索「Clusted Index Seek」が使用されます。
f:id:knkomko:20200412005851p:plain:w350

インデックスを作成していない列を使用した場合の実行プラン

クラスター化インデックスではインデックスを使用しない場合には最も遅い検索「Table Scan」が行われます。
f:id:knkomko:20200412011144p:plain:w350

クラスター化インデックスではインデックスを使用しない場合には「Clustered Index Scan」が行われます。
f:id:knkomko:20200412011247p:plain:w350

クラスター化インデックスは実データを物理的に並び替えてインデックスとして使用するので「テーブル=クラスター化インデックス」となり、テーブルスキャンの概念がなくなるため「Cluesred Index Scan」の動作となります。