ページとエクステントについて
SQL Server のデータ ストレージの基本単位はページです。データベースのデータ ファイル (.mdf または .ndf) に割り当てられたディスク領域は、0 ~ n の連番が付けられたページに論理的に分割されます。ディスク I/O 操作は、このページ レベルで実行されます。つまり、SQL Server ではデータ ページ全体の読み取りまたは書き込みが行われます。
エクステントは、物理的に連続する 8 ページをまとめたもので、ページを効率的に管理するために使用されます。すべてのページは、エクステントに格納されます。
ページ
SQL Server では、ページのサイズは 8 KB です。したがって、SQL Server データベースには 1 MB あたり 128 ページあります。各ページの先頭には 96 バイトのヘッダーがあり、ここには各ページに関するシステム情報が格納されています。この情報には、ページ番号、ページの種類、ページ上の空き容量、そのページを所有しているオブジェクトのアロケーション ユニット ID が含まれます。
次の表に、SQL Server データベースのデータ ファイルで使用されるページの種類を示します。
ページの種類 |
内容 |
---|---|
データ |
すべてのデータが含まれるデータ行。ただし、text in row が ON に設定されている場合、text、ntext、image、nvarchar(max)、varchar(max)、varbinary(max)、xml 型のデータは除きます。 |
インデックス |
インデックスのエントリ。 |
テキスト/イメージ |
LOB (ラージ オブジェクト) データ型 :
データ行が 8 KB を超える場合の可変長データ列 :
|
グローバル アロケーション マップ、セカンダリ グローバル アロケーション マップ |
エクステントが割り当てられているかどうかについての情報。 |
ページ空き容量 |
ページ割り当てとページ上で使用可能な空き容量に関する情報。 |
インデックス アロケーション マップ |
テーブルまたはインデックスによって使用されるエクステントに関するアロケーション ユニットごとの情報。 |
一括変更マップ |
最後の BACKUP LOG ステートメント以降の一括操作で変更されたエクステントに関するアロケーション ユニットごとの情報。 |
差分変更マップ |
最後の BACKUP DATABASE ステートメント以降に変更されたエクステントに関するアロケーション ユニットごとの情報。 |
注 |
---|
ログ ファイルにはページではなく、一連のログ レコードが含まれます。 |
データ行はヘッダーの直後から始まり、ページ上に連続的に配置されます。ページの末尾から行オフセット テーブルが始まります。各行オフセット テーブルにはページ上の 1 行につき 1 つのエントリが格納されます。各エントリには、その行の最初のバイトがページの先頭からどれだけ離れているかが記録されます。行オフセット テーブル内のエントリは、ページ上の行と逆の順序になっています。
大きな行のサポート
行は複数のページにまたがることができません。ただし、行の一部をその行のページから移動することで、事実上大きな行を実現できます。ページの 1 行に格納できるデータおよびオーバーヘッドの量は、最大 8,060 バイト (8 KB) です。ただし、これにはテキスト/イメージの種類のページに格納されているデータは含まれません。varchar、nvarchar、varbinary、または sql_variant 列があるテーブルに対してはこの制限が緩和されます。テーブル内のすべての固定長列と可変長列の行サイズの合計が、8,060 バイトの制限を超過した場合、SQL Server は、サイズの最も大きなものから順に動的に 1 つ以上の可変長列を ROW_OVERFLOW_DATA アロケーション ユニットのページに移動します。挿入操作または更新操作により行の合計サイズが 8,060 バイトの制限を超えると、必ずこの処理が実行されます。列が ROW_OVERFLOW_DATA アロケーション ユニットのページに移動された場合、IN_ROW_DATA アロケーション ユニットに元のページの 24 バイトのポインタが保持されます。その後の操作により、行サイズが削減されると、SQL Server は動的に列を元のデータ ページに戻します。詳細については、「8 KB を超える場合の行オーバーフロー データ」を参照してください。
エクステント
エクステントは、領域を管理する際の基本単位です。1 つのエクステントは物理的に連続した 8 ページ、つまり 64 KB です。したがって、SQL Server データベースには 1 MB あたり 16 エクステントあります。
領域の割り当てを効率的にするために、SQL Server ではデータ量が少ないテーブルにエクステント全体が割り当てられることはありません。SQL Server には次の 2 種類のエクステントがあります。
単一エクステントは、単一のオブジェクトに所有され、所有しているオブジェクトだけがエクステント内の 8 ページすべてを使用できます。
混合エクステントは最大 8 つのオブジェクトによって共有されます。エクステント内の各 8 ページを、それぞれ異なるオブジェクトが所有できます。
新規テーブルや新規インデックスには、通常、混合エクステントからページが割り当てられます。そのテーブルやインデックスが 8 ページまで拡張された時点で、その後の割り当てには単一エクステントが使用されるように切り替えられます。インデックスに 8 ページ分を生成できるだけの行がある既存のテーブルのインデックスを作成すると、インデックスへのすべての割り当ては単一エクステントになります。