エクステント割り当てと空き領域の管理

エクステントの割り当てを管理したり、空き領域を追跡したりする SQL Server のデータ構造は、比較的単純です。このデータ構造には、次の利点があります。

  • 空き領域情報は高密度で格納されるので、比較的少数のページに格納できます。

    このため、割り当て情報の取得に必要なディスク読み取り量が減り、処理が高速化します。また、アロケーション ページがメモリ内にとどまる機会が増え、改めて読み込む必要も少なくなります。

  • 割り当て情報の大部分は相互に連結されていません。このため、割り当て情報のメンテナンスが容易になっています。

    個々のページの割り当ておよび割り当て解除は迅速に行うことができます。これにより、ページ割り当てや割り当て解除を必要とする同時実行中のタスク間の競合が減少します。

エクステント割り当ての管理

SQL Server は、エクステントの割り当てを記録するために次の 2 種類のアロケーション マップを使用します。

  • GAM (Global Allocation Map)

    GAM ページには、どのエクステントが既に割り当てられているかが記録されます。1 つの GAM で 64,000 のエクステント、つまり約 4 GB のデータが対象となります。GAM では対象とする範囲内のエクステント 1 つにつき 1 ビットが使用されます。このビットが 1 の場合、そのエクステントは空いており、0 の場合は割り当て済みです。

  • SGAM (Shared Global Allocation Map)

    SGAM ページには、混合エクステントとして使用中であり、1 ページ以上が未使用であるエクステントが記録されます。1 つの SGAM で 64,000 のエクステント、つまり約 4 GB のデータが対象となります。SGAM では対象とする範囲内のエクステント 1 つにつき 1 ビットが使用されます。このビットが 1 の場合、そのエクステントは混合エクステントとして使用されており、空きページが含まれています。ビットが 0 の場合、混合エクステントとして使用されていないエクステントか、すべてのページが使用されている混合エクステントです。

各エクステントには、現在の使用状況に基づいて GAM および SGAM 内に次のビット パターンが設定されます。

エクステントの現在の使用状況

GAM のビット設定

SGAM のビット設定

空きがあり、未使用

1

0

単一エクステントであるか、空きページのない混合エクステント

0

0

空きページがある混合エクステント

0

1

このようなビット パターンの設定により、エクステントの管理アルゴリズムが簡素化されます。データベース エンジンが単一エクステントを割り当てる際には、GAM の中から 1 のビットを検索し、そのビットを 0 に設定します。空きページがある混合エクステントを見つける際には、SGAM の中から 1 のビットを検索します。データベース エンジンが混合エクステントを割り当てる際には、GAM の中から 1 のビットを検索してそのビットを 0 に設定し、SGAM 中の対応するビットを 1 に設定します。エクステントの割り当てを解除する際には、GAM のビットを 1 に設定し、SGAM のビットを 0 に設定します。データベース エンジンによりデータベース内のデータが均等に分散されるので、実際にはさらに高度なアルゴリズムがデータベース エンジンの内部で使用されます。この高度なアルゴリズムも、エクステント割り当て情報のチェーンを管理する必要がないので簡素化されています。

空き領域の追跡

PFS (Page Free Space) ページには各ページの割り当て状態、個々のページが割り当て済みかどうか、および各ページの空き領域の量が記録されます。PFS では 1 ページにつき 1 バイトを使用してページが割り当て済みかどうかを示し、割り当て済みの場合はそのページの使用率を 0%、1 ~ 50%、51 ~ 80%、81 ~ 95%、96 ~ 100% の 5 段階で示します。

エクステントがオブジェクトに割り当てられた後は、エクステント内のどのページが割り当て済みでどのページが空いているかをデータベース エンジンが PFS ページに記録します。この情報は、データベース エンジンで新しいページを割り当てる必要が生じたときに使用されます。ページ内の空き領域の量は、ヒープおよび Text/Image ページに関してのみ管理されます。データベース エンジンが新しく挿入された行を保持するための空き領域があるページを検索する際に、この情報が使用されます。新しい行を挿入する場所がインデックス キーの値で設定されるので、インデックスは PFS の追跡を必要としません。

PFS ページはデータ ファイル内でファイル ヘッダー ページの直後に位置するページ (ページ番号 1) です。その次が GAM ページ (ページ番号 2) で、さらに SGAM ページ (ページ番号 3) が続きます。最初の PFS ページの後、約 8,000 ページごとに 1 つの PFS ページがあります。ページ 2 の最初の GAM ページの後に 64,000 エクステント分の GAM ページがあり、ページ 3 の最初の SGAM ページの後に 64,000 エクステント分の SGAM ページがあります。下図に、データベース エンジンがエクステントの割り当てと管理に使用する一連のページを示します。

エクステントの割り当てと管理に使用するページ