1

私は実行計画にやや慣れていません。実際のデータ行はインデックス ツリーのリーフ レベルに含まれているのに対し、非クラスター化インデックスにはインデックス付き列の値と残りの行データの場所へのポインターのみが含まれているため、クラスター化インデックスは非常に高速であると常に理解しています。したがって、クラスタ化されていない方がクラスタ化されているよりも多くの IO があります。

これをテストするために、EmployeeID(最初の列) を主キーとする 1,000,000 レコード テーブルを使用し、同じフィールドに非クラスター化インデックスも追加しました。次に、クエリ ヒントを使用して、使用されている各インデックスの結果を比較しました。

Select EmployeeID from Employees with(index(PK_EmployeeID))
go

select EmloyeeID from Employees with(index(IX_EmployeeID))
go

結果は、クラスター化されていない場合よりもクラスター化されている場合の方が、IO とクエリのコストが (バッチと比較して) 多いことを示しています。誰かがこれを説明してもらえますか?

4

1 に答える 1

4

テスト クエリの場合、結果セットに必要なすべての列が既に含まれているため、インデックスは "カバリング" インデックスです。したがって、実際のテーブルに対する追加の読み取りは必要ありません。また、インデックスが小さい (ページが少ない) ため、アクセスが高速になります。
クラスター化インデックスは、実際にはテーブル自体であり、インデックス順に並べられています。より多くの列が含まれているため、より多くのページ読み取りが必要になります。

于 2013-10-09T17:45:25.413 に答える