クラスタ化インデックスの構造
SQL Server では、インデックスは B ツリーとして構成されます。インデックス B ツリー内の各ページをインデックス ノードと呼びます。B ツリーの最上位ノードはルート ノードといいます。インデックス内の最下位レベルのノードをリーフ ノードと呼びます。ルート ノードとリーフ ノードの間にあるインデックス レベルは、総称して中間レベルといいます。クラスタ化インデックスでは、リーフ ノードに基になるテーブルのデータ ページが含まれています。ルート ノードと中間レベル ノードには、インデックス行を保持するインデックス ページが含まれています。各インデックス行には、キー値と、B ツリー内の中間レベル ページかインデックスのリーフ レベルのデータ行のいずれかへのポインタが含まれています。インデックスの各レベルのページは、二重にリンクされた一覧でリンクされています。
クラスタ化インデックスは、そのインデックスが使用するパーティションにつき 1 行を sys.partitions に持っています。その行では、index_id の値が 1 と等しくなります。既定では、クラスタ化インデックスのパーティションは 1 つです。クラスタ化インデックスにパーティションが複数ある場合、各パーティションは、そのパーティションのデータを保持する B ツリー構造になります。たとえば、クラスタ化インデックスに 4 つのパーティションがある場合、4 つの B ツリーを持つ構造になります。この場合、パーティションごとに 1 つの B ツリーがあります。
クラスタ化インデックスのデータ型によっては、各クラスタ化インデックスの構造に 1 つ以上のアロケーション ユニットが含まれ、そこに特定のパーティションのデータが格納され、管理されます。各クラスタ化インデックスには、パーティションごとに、少なくとも 1 つの IN_ROW_DATA アロケーション ユニットがあります。また、クラスタ化インデックスにラージ オブジェクト (LOB) 列が含まれている場合は、パーティションごとに 1 つの LOB_DATA アロケーション ユニットもあります。さらに、行サイズの上限である 8,060 バイトを超える可変長列が含まれている場合は、パーティションごとに 1 つの ROW_OVERFLOW_DATA アロケーション ユニットがあります。アロケーション ユニットの詳細については、「テーブルとインデックスの編成」を参照してください。
データ チェーン内のページとページ内の行は、クラスタ化インデックス キーの値に基づいて並べ替えられます。挿入はすべて、挿入される行のキー値が、順序付けられた既存の行の並びの中に正しく収まる位置で行われます。B ツリーのページ集合は、sys.system_internals_allocation_units システム ビューのページ ポインタによりアンカーが設定されます。
重要 |
---|
sys.system_internals_allocation_units システム ビューは MicrosoftSQL Server の内部使用専用に予約されています。将来の互換性は保証されません。 |
クラスタ化インデックスの場合、sys.system_internals_allocation_units の root_page 列が特定のパーティションの最上位のクラスタ化インデックスを指しています。SQL Server は、このインデックスを下方向に移動してクラスタ化インデックス キーに対応する行を検索します。キーの範囲を検出する場合、SQL Server は、インデックスを移動していき、その範囲の開始キー値を検出し、前のポインタか次のポインタを使用して各データ ページをスキャンします。データ ページ チェーンの先頭ページを検出する場合、SQL Server は、インデックスのルート ノードから左端のポインタをたどります。
次の図は、1 つのパーティション内のクラスタ化インデックスの構造を示します。