オブジェクトに使用されている領域の管理

IAM (Index Allocation Map) 1 ページには、アロケーション ユニットが使用する 4 GB 分のデータベース ファイルのエクステントがマップされます。アロケーション ユニットは次の 3 種類のいずれかです。

  • IN_ROW_DATA

    ヒープまたはインデックスのパーティションを保存します。

  • LOB_DATA

    xml、varbinary(max)、varchar(max) などの LOB (ラージ オブジェクト) データ型を保存します。

  • ROW_OVERFLOW_DATA

    varchar、nvarchar、varbinary、sql_variant のいずれかの型の、行サイズの上限である 8,060 バイトを超える列に格納された可変長のデータを保存します。

ヒープまたはインデックスの各パーティションには、IN_ROW_DATA アロケーション ユニットが必ず含まれています。ヒープまたはインデックスのスキーマによっては、LOB_DATA アロケーション ユニットまたは ROW_OVERFLOW_DATA アロケーション ユニットが含まれる場合もあります。アロケーション ユニットの詳細については、「テーブルとインデックスの編成」を参照してください。

IAM 1 ページで、GAM ページまたは SGAM ページと同じ 4 GB 分のファイルを管理できます。複数のファイルのエクステントまたは 1 ファイル内でも 4 GB の単位の複数にまたがるエクステントがアロケーション ユニットに含まれている場合、1 つの IAM チェーンに複数の IAM ページがリンクされます。したがって、各アロケーション ユニットには、含まれているエクステントが所属するファイル 1 つについて、IAM が少なくとも 1 ページ存在します。アロケーション ユニットに割り当てられているファイルのエクステントの範囲が 1 ページの IAM に記録できる範囲を超えている場合、1 つのファイルに複数の IAM ページが存在する場合もあります。

IAM (Index Allocation Map) ページによるエクステントの管理

IAM ページはアロケーション ユニットごとに必要に応じて割り当てられ、そのファイル内での配置はランダムです。アロケーション ユニットの最初の IAM ページはシステム ビュー sys.system_internals_allocation_units のポインタが指しています。アロケーション ユニットのすべての IAM ページは 1 つのチェーンにリンクされています。

重要な注意事項重要

sys.system_internals_allocation_units システム ビューは内部だけで使用されていて、変更されることがあります。互換性は保証されません。

アロケーション ユニットのチェーンにリンクされている IAM ページ

IAM ページには、その IAM ページによってマップされるエクステントの範囲の開始エクステントを示すヘッダーがあります。また、1 ビットが 1 つのエクステントを表す大きな 1 つのビットマップがあります。マップ内の最初のビットは、その範囲で最初のエクステントを表し、2 番目のビットは第 2 エクステントを表し、それ以降のビットも同様の順でエクステントを表します。ビットが 0 の場合、そのビットが表すエクステントは、IAM を所有するアロケーション ユニットに割り当てられていません。ビットが 1 の場合、そのビットが表すエクステントは、IAM ページを所有するアロケーション ユニットに割り当てられています。

新しい行を挿入する必要があるのに現在のページに使用できる領域がない場合、SQL Server データベース エンジンでは IAM ページおよび PFS ページで割り当てのためのページを検索するか、ヒープあるいは Text 型または Image 型のページについては行を格納するのに必要な空き領域があるページを検索します。まず、データベース エンジンは IAM ページを使用してそのアロケーション ユニットに割り当てられているエクステントを検索します。それぞれのエクステントについて、データベース エンジンは使用可能なページがあるかどうかを PFS ページの中で検索します。IAM ページおよび PFS ページは 1 ページで多数のデータ ページを管理できるので、データベース内の IAM ページおよび PFS ページの数はわずかです。このため、IAM ページおよび PFS ページは一般的に SQL Server バッファ プールのメモリに入っており、高速に検索できます。インデックスについては、インデックス キーで新しい行の挿入ポイントを設定します。インデックスでは既に説明したような検索処理は行われません。

データベース エンジンによりアロケーション ユニットに新しいエクステントが割り当てられるのは、挿入する行を格納するのに必要な空き領域のあるページが既存のエクステントの中ですぐに見つからない場合のみです。データベース エンジンは比例割り当てアルゴリズムを使用して、ファイル グループ内の利用可能なエクステントからエクステントを割り当てます。ファイル グループに 2 つのファイルがあり、一方のファイルにもう一方の 2 倍の空き領域がある場合は、空きが少ないファイルから 1 ページ割り当てられるごとに、空きが多いファイルからは 2 ページが割り当てられます。したがって、ファイル グループ内のすべてのファイルは、使用済み領域のパーセンテージがほとんど同じになります。