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