ヒープ構造

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

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

sys.system_internals_allocation_units システム ビューの first_iam_page 列では、特定のパーティション内のヒープに割り当てた領域を管理する IAM ページ チェーンの最初の IAM ページを指しています。SQL Server では、ヒープ全体の移動には IAM ページを使用します。データ ページとその中にある行は特定の順序になっておらず、リンクもされていません。データ ページ間の論理接続は、IAM ページ内に記録されている情報だけです。

重要な注意事項重要

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

IAM をスキャンしてヒープのページを保持しているエクステントを見つけることによって、ヒープのテーブル スキャンまたはシリアル読み取りが行われます。IAM ではエクステントがデータ ファイルに入っている順序で表されています。したがって、シリアル ヒープ スキャンでは各ファイルが順に読み取られて進行します。スキャン シーケンスの設定に IAM ページを使用すると、ヒープの行が挿入順どおりに戻されるとは限らないことになります。

次の図に、IAM ページを使用して単一のパーティション分割されたヒープ内のデータ行が SQL Server データベース エンジンで取得されるしくみを示します。

単一パーティション ヒープによる IAM ページのデータ取得