この節は PostgreSQL のテーブルで使われるページフォーマットの概略を提供します。ユーザ定義アクセスメソッドはこのページフォーマットを使用する必要はありません。
以下の説明では 1 バイト は 8 ビットからなることを前堤としています。更に、単語アイテム は PostgreSQL テーブルに格納されるデータのことを指しています。
Table 7-1 は、通常のPostgreSQLテーブルと PostgreSQL インデックス (例 B-tree インデックス)においてページがどのように構成されているかを示しています。
Table 7-1. サンプルページレイアウト
アイテム | 説明 |
---|---|
itemPointerData | |
中身 | |
itemData... | |
割り当てられていない空間 | |
ItemContinuationData | |
特殊な空間 | |
"ItemData 2" | |
"ItemData 1" | |
ItemIdData | |
PageHeaderData |
それぞれのページの最初の 8 バイトはページヘッダ(PageHeaderData)から構成されています。ヘッダの中では、最初の三つの 2 バイトフィールド(lower,upper,そして special)が、割り当てられていない空間の始まり、割り当てられていない空間の終り、そして特別な空間 の始まりのバイトオフセットを表しています。特別な空間は、ページ初期化時にページの最後に割り当てられる区域で、アクセスメソッド特有の情報を持っています。ページヘッダの最後の 2 バイトである opaque は、そのページのサイズと内部部分の情報をコード化します。ページサイズはそれぞれのページに格納されます。なぜなら、バッファプールの中のフレームは、テーブル内のフレームの規則によって、フレーム上で同じサイズのページに分けられるかもしれないからです。内部部分の情報は、ページの再組織化がいつ行なわれるべきかを決定するために使われます。
ページヘッダに続くのはアイテム識別子(ItemIdData)です。新しいアイテム識別子は、割り当てられていない空間の最初の 4 バイトに割り当てられます。アイテム識別子は解放されるまで動かされることがないので、そのインデックスはアイテムのページ上での位置を表すのに使うことができます。実際、PostgreSQLが作る、アイテムへのポインタ(ItemPointer)はフレーム番号とアイテム識別子のインデックスによって構成されています。アイテム識別子は、アイテムが開始されるバイトオフセット、バイトで表されたその長さ、そして表示に影響する属性ビットの集合を持っています。
アイテムそれ自体は、割り当てられていない空間の最後から順番に割り当てられた空間に格納されます。通常は、アイテムは評価されません。しかし、アイテムが一ページに載せるには長すぎる場合や、アイテムの一部が必要とされている場合、アイテムは分割され、それぞれの部分は次のような方法で個別のアイテムとして扱われます。最初のものから最後から二番目のものはアイテム継続構造体(ItemContinuationData)に配置されます。この構造体は、次の部分とその部分自体を指す itemPointerData を持っています。最後の部分は通常通りに扱われます。