非クラスター化インデックスのリーフ ページのクラスター化インデックス(主キー)は重複されない

インデックスについては、今まで私たちのセミナーや本などで何度も説明してきましたが、今回は素朴な疑問を取り上げてみたいと思います。


主キー(クラスター化インデックス)を持つテーブルの、非クラスター化インデックスのリーフ ページにはクラスター化インデックスの値が格納されています。

たとえば、社員番号を主キー(クラスター化インデックス)とするテーブル「社員」の姓という列に対して非クラスター化インデックスを作成すると、「姓」インデックスのリーフページに社員番号の値が格納されます。このことは、DBCC IND と DBCC PAGE を使って確認することができます。



ここまでは、私たちの執筆物やセミナーで何度も説明してきているのですが、たとえば、次のようなクエリを実行した場合に、実行プランに不足しているインデックス(Missing Index)として、クラスター化インデックスの列を含めるように複合インデックスが提示される場合があります。



この場合、「名」と「社員番号」の複合インデックスを作成するとどうなるのでしょうか?

結果は、「名」だけのインデックスを作成しても、「名」と「社員番号」の複合インデックスを作成してもインデックスのリーフページは同じになります。
クラスター化インデックスの列を含むインデックスを作成しても、重複して格納されることはありません。


「名」だけの非クラスター化インデックスを作成した場合のリーフページ


「名」と「社員番号」を含めた複合インデックス(非クラスター化インデックス)を作成した場合のリーフページ


インデックスの構造や、複合インデックス/付加列インデックスの違いなどについては、私たちが執筆した SQL Server 2008/SQL Server 2008 R2 自習書シリーズの「インデックスの基礎とメンテナンス」(http://www.microsoft.com/japan/sqlserver/2008/self-learning/default.mspx#cat04)で説明しています。
また、書籍では「実践 SQL Server 2008 運用管理入門」(日経BP社)、また、古いバージョンでは「SQL Server 2000 でいってみよう」でも説明していますので、参考にしていただければと思います。