トップページ >  PostgreSQL >  テーブルの構造
初版2012/02/09: 最終更新日2012/02/09
  テーブルの構造
目次
テーブルの構造
ページの構造
タプルの構造
テーブルの構造
テーブルは、ブロックという8092バイトの領域が0~131072(1GB)個以下集まったものです。テーブル作成すると0Byteのヒープファイルというのが作成されます。
ブロックサイズが131072個、すなわちヒープファイルが1GB超えると、新しいヒープファイルが作成されます。

ブロックのなかにはページがあります。が、ブロックの中には1つのページのようなので、ブロック=ページと考えてよいようです。
ページの中に行が0個以上あります。さらに行のこともPostgreSQLではタプルと呼びます。

テーブルの構造


ページの構造
ページの先頭には、24バイトの管理領域があり、ページヘッダと呼ばれます。
タプルが格納されるにつき、ページヘッダの後に4バイトのアイテムデータ(アイテムポインタ)が格納されます。タプルはページの後方から格納されていきます。
具体的には以下の図のようになります。

ページの構造


タプルが後方から格納されるに従って、先頭からアイテムポインタが先頭から追加されるようなイメージです。

タプルの構造
タプルの先頭には27バイトのタプルヘッダがあります。そのあとに1バイトのヌルビットマップというのが存在します。
行データにnullを含むデータが存在しない場合、ヌルビットマップが存在しません。
逆に行データにnullを含むデータが存在する場合、ヌルビットマップが存在し、そのヌルビットマップのバイト数は以下のバイト数となります。

(nullableな列数 + 7) ÷ 8 
これが4の倍数にならない場合、4の倍数に切り上げるためにパディングが行われます。例えばヌルビットマップが存在しない場合は1バイトだけパディングされます。
その後に4バイトのOIDが格納されます。後は実データ分のバイト数が格納されます。
簡単なタプルの構造を以下に示します。

タプルの構造


但し、タプルが追加されると4バイトのアイテムポインタも作成されるのでデータベース見積もりの際は注意が必要です。
以下、参考サイトです。
http://www2b.biglobe.ne.jp/~caco/webdb-pdfs/vol24_214-221.pdf