非クラスタ化インデックスの構造

非クラスタ化インデックスもクラスタ化インデックスと同じ B ツリー構造ですが、次に示す大きな相違点があります。

  • 基になるテーブルのデータ行は、非クラスタ化キーに基づいた順序で並べ替えられたり格納されたりしません。

  • 非クラスタ化インデックスのリーフ層は、データ ページではなくインデックス ページで構成されます。

非クラスタ化インデックスは、クラスタ化インデックスが設定されたテーブルやビュー、またはヒープに定義できます。非クラスタ化インデックスの各インデックス行には、非クラスタ化キーの値および行ロケータが含まれています。このロケータは、キー値があるクラスタ化インデックスまたはヒープのデータ行を指します。

非クラスタ化インデックス行内の行ロケータは、次に示すような、行を指すポインタまたは行のクラスタ化インデックス キーのいずれかです。

  • テーブルがヒープで、クラスタ化インデックスが設定されていない場合、行ロケータはその行へのポインタです。このポインタは、ファイル識別子 (ID)、ページ番号、およびそのページ上での行の番号で構成されます。ポインタ全体は、RID (行 ID) と呼ばれます。

  • テーブルにクラスタ化インデックスがある場合、またはインデックスがインデックス付きビューにある場合は、行ロケータが行のクラスタ化インデックス キーになります。クラスタ化インデックスが一意インデックスではない場合、SQL Server では内部で収集された uniqueifier と呼ばれる値を追加して、重複したキーを一意キーにします。4 バイトのこの値は、ユーザーには表示されません。この値が追加されるのは、非クラスタ化インデックスで使用するためにクラスタ化キーを一意にする必要がある場合だけです。SQL Server では、データ行を取得する場合、非クラスタ化インデックスのリーフ行に格納されているクラスタ化インデックス キーを使用してクラスタ化インデックスを検索します。

非クラスタ化インデックスは、そのインデックスが使用するパーティションにつき 1 行を sys.partitions に持っています。その行では、index_id の値が 0 よりも大きくなります。既定では、非クラスタ化インデックスのパーティションは 1 つです。非クラスタ化インデックスにパーティションが複数ある場合、各パーティションは、その特定のパーティションに対してインデックス行を保持する B ツリー構造になります。たとえば、非クラスタ化インデックスに 4 つのパーティションがある場合、4 つの B ツリーを持つ構造になります。この場合、パーティションごとに 1 つの B ツリーがあります。

非クラスタ化インデックスのデータ型によっては、各非クラスタ化インデックスの構造に 1 つ以上のアロケーション ユニットが含まれ、そこに特定のパーティションのデータが格納され、管理されます。各非クラスタ化インデックスには、インデックス B ツリーのページが格納されているパーティションごとに、少なくとも 1 つの IN_ROW_DATA アロケーション ユニットがあります。また、非クラスタ化インデックスにラージ オブジェクト (LOB) 列が含まれている場合は、パーティションごとに 1 つの LOB_DATA アロケーション ユニットもあります。さらに、行サイズの上限である 8,060 バイトを超える可変長列が含まれている場合は、パーティションごとに 1 つの ROW_OVERFLOW_DATA があります。アロケーション ユニットの詳細については、「テーブルとインデックスの編成」を参照してください。B ツリーのページ集合は、sys.system_internals_allocation_units システム ビューの root_page ポインタによってアンカーが設定されます。

重要な注意事項重要

sys.system_internals_allocation_units システム ビューは Microsoft SQL Server の内部使用専用に予約されています。将来の互換性は保証されません。

次の図に、1 つのパーティション内の非クラスタ化インデックスの構造を示します。

非クラスター化インデックスのレベル

付加列インデックス

非キー列と呼ばれる付加列を追加することにより、非クラスタ化インデックスの機能をそのインデックスのリーフ レベルにまで拡張できます。キー列が非クラスタ化インデックスのすべてのレベルに格納されている場合は、非キー列はリーフ レベルだけに格納されます。詳細については、「付加列インデックス」を参照してください。