概念的には、SQL Serverのフィルター処理されていない、クラスター化されていないインデックスのリーフレベルには、基になるテーブルの行ごとに1行のデータがあります。リーフレベルの列は、以下とは異なる列です。
- インデックスキーを構成する列。(インデックスをナビゲートできるように)
- ベーステーブルの対応する行への概念的なポインタ。(したがって、ベーステーブルの対応する行に戻ることができます)
- ヒープの場合、ポインターはRIDまたは行IDです。
- クラスター化インデックスの場合、ポインターはクラスター化インデックスを構成するキー列です。
- 含まれている列(適切な測定のために追加の列がスタックしている)
例えば:
CREATE TABLE t1 (id int not null, first_name varchar(20), last_name varchar(20))
CREATE CLUSTERED INDEX CIX_t1 on t1 (id)
CREATE INDEX IX_t1_a on t1 (first_name)
CREATE INDEX IX_t1_b on t1 (first_name) INCLUDE (id)
CREATE INDEX IX_t1_c on t1 (first_name) INCLUDE (id, last_name)
CREATE INDEX IX_t1_d on t1 (first_name, last_name)
CREATE INDEX IX_t1_e on t1 (first_name, id)
IX_t1_aのリーフレベルは、(first_name、id)で構成されます。
IX_t1_bのリーフレベルは、(first_name、id)で構成されます。
IX_t1_cのリーフレベルは、(first_name、id、last_name)で構成されます。
IX_t1_dのリーフレベルは、(first_name、id、last_name)で構成されます。
IX_t1_eのリーフレベルは(first_name、id)で構成されます
列が2回含まれることはありません。上記の例では、インデックスa、b、cは互いに重複しています。同様に、インデックスcとdも重複しています。(クラスター化インデックスと非クラスター化インデックスの一意性に応じて、非リーフレベルには微妙な違いがありますが、インデックスを使用できるクエリは同じです。)