<chapter id="page">

<!-- <title>Page Files</title> -->
<title>ページファイル</title>
<indexterm><primary sortas="ぺーじふぁいる">ページファイル</primary></indexterm><indexterm><primary>PostgreSQL</primary><secondary sortas="ぺーじふぁいる">ページファイル</secondary></indexterm>
<abstract>
<para>
<!-- A description of the database file default page format. -->
データベースファイルのデフォルトページフォーマットの説明です。

</para>
</abstract>

<para>
<!-- 
This section provides an overview of the page format used by 
<productname>Postgres</productname>
tables.  User-defined access methods need not use this page format. -->

この節は<productname>Postgres</productname>のテーブルで使われるページフォーマットの概略を提供します。ユーザー定義アクセスメソッドはこのページフォーマットである必要はありません。


</para>

<para>
<!-- In the following explanation, a
<firstterm>byte</firstterm>
is assumed to contain 8 bits.  In addition, the term
<firstterm>item</firstterm>
refers to data that is stored in <productname>Postgres</productname> tables.
-->
以下の説明では1<firstterm>バイト</firstterm>は8ビットからなることを前堤としています。さらに、<firstterm>アイテム</firstterm>という単語は、<productname>Postgres</productname>テーブルに格納されるデータのことを指しています。

</para>

<para>
<!-- 
The following table shows how pages in both normal <productname>Postgres</productname> tables
 and <productname>Postgres</productname> indices
(e.g., a B-tree index) are structured. -->

以下のテーブルは、通常の<productname>Postgres</productname>テーブルと<productname>Postgres</productname>インデックス（たとえばB-treeインデックス）が構成されている方法を示しています。
</para>

<table tocentry="1">
<!-- <title>Sample Page Layout</title> -->
<title>サンプルページレイアウト</title>
<!-- <titleabbrev>Page Layout</titleabbrev> -->
<titleabbrev>ページレイアウト</titleabbrev>
<tgroup cols="1">
<thead>
<row>
<entry><!-- Item -->アイテム
</entry>
<!-- entry -->
<!-- Description 説明 -->
<!-- /entry -->
</row>
</thead>

<tbody>

<row>
<entry>itemPointerData
</entry>
</row>

<row>
<entry><!-- filler -->中身
</entry>
</row>

<row>
<entry>itemData...
</entry>
</row>

<row>
<entry><!-- Unallocated Space -->割り当てられていない空間
</entry>
</row>

<row>
<entry>ItemContinuationData
</entry>
</row>

<row>
<entry><!-- Special Space -->特別な空間
</entry>
</row>

<row>
<entry>``ItemData 2''
</entry>
</row>

<row>
<entry>``ItemData 1''
</entry>
</row>

<row>
<entry>ItemIdData
</entry>
</row>

<row>
<entry>PageHeaderData
</entry>
</row>

</tbody>
</tgroup>
</table>

<!--
.&bsol;" Running
.&bsol;" .q .../bin/dumpbpages
.&bsol;" or
.&bsol;" .q .../src/support/dumpbpages
.&bsol;" as the postgres superuser
.&bsol;" with the file paths associated with
.&bsol;" (heap or B-tree index) classes,
.&bsol;" .q .../data/base/<database-name>/<class-name>,
.&bsol;" will display the page structure used by the classes.
.&bsol;" Specifying the
.&bsol;" .q -r
.&bsol;" flag will cause the classes to be
.&bsol;" treated as heap classes and for more information to be displayed."
-->

<para>
<!-- The first 8 bytes of each page consists of a page header
(PageHeaderData).
Within the header, the first three 2-byte integer fields
(<firstterm>lower</firstterm>,
<firstterm>upper</firstterm>,
and
<firstterm>special</firstterm>)
represent byte offsets to the start of unallocated space, to the end
of unallocated space, and to the start of <firstterm>special space</firstterm>.
Special space is a region at the end of the page that is allocated at
page initialization time and contains information specific to an
access method.  The last 2 bytes of the page header,
<firstterm>opaque</firstterm>,
encode the page size and information on the internal fragmentation of
the page.  Page size is stored in each page because frames in the
buffer pool may be subdivided into equal sized pages on a frame by
frame basis within a table.  The internal fragmentation information is
used to aid in determining when page reorganization should occur. -->

それぞれのページの最初の8バイトはページヘッダー（PageHeaderData）で構成されています。ヘッダーの中では、最初の3つの2バイトフィールド（<firstterm>lower</firstterm>、<firstterm>upper</firstterm>、<firstterm>special</firstterm>）が割り当てられていない空間の始まり、割り当てられていない空間の終わり、そして<firstterm>特別な空間</firstterm>の始まりのバイトオフセットを表しています。「特別な空間」は、ページ初期化時にページの最後に割り当てられる区域で、アクセスメソッド特有の情報を持っています。ページヘッダーの最後の2バイトである<firstterm>opaque</firstterm>は、そのページのサイズと内部部分の情報をコード化します。ページサイズはそれぞれのページに格納されます。なぜなら、バッファプールの中のフレームは、テーブル内のフレームの規則によって、フレーム上で同じサイズのページに分けられるかもしれないからです。内部部分の情報は、ページの再組織化がいつ行われるべきかを決定するために使われます。

</para>

<para>
<!-- 
Following the page header are item identifiers
(<firstterm>ItemIdData</firstterm>).
New item identifiers are allocated from the first four bytes of
unallocated space.  Because an item identifier is never moved until it
is freed, its index may be used to indicate the location of an item on
a page.  In fact, every pointer to an item
(<firstterm>ItemPointer</firstterm>)
created by <productname>Postgres</productname> consists of a frame number and an index of an item
identifier.  An item identifier contains a byte-offset to the start of
an item, its length in bytes, and a set of attribute bits which affect
its interpretation. -->

ページヘッダーに続くのはアイテム識別子（<firstterm>ItemIdData</firstterm>）です。新しいアイテム識別子は、割り当てられていない空間の最初の4バイトに割り当てられます。アイテム識別子は解放されるまで動かされることがないので、そのインデックスはアイテムのページ上での位置を表すのに使うことができます。実際、<productname>Postgres</productname>が作る、アイテムへのポインタ（<firstterm>ItemPointer</firstterm>）はフレーム番号とアイテム識別子のインデックスによって構成されています。アイテム識別子は、アイテムが開始されるバイトオフセット、バイトで表されたその長さ、そして表示に影響する属性ビットの集合を持っています。
</para>

<para>
<!-- 
The items themselves are stored in space allocated backwards from
the end of unallocated space.  Usually, the items are not interpreted.
However when the item is too long to be placed on a single page or
when fragmentation of the item is desired, the item is divided and
each piece is handled as distinct items in the following manner.  The
first through the next to last piece are placed in an item
continuation structure
(<firstterm>ItemContinuationData</firstterm>).
This structure contains
itemPointerData
which points to the next piece and the piece itself.  The last piece
is handled normally. -->

アイテムそれ自体は、割り当てられていない空間の最後から順番に割り当てられた空間に格納されます。通常は、アイテムは評価されません。しかし、アイテムが1ページに載せるには長すぎる場合や、アイテムの一部が必要とされている場合、アイテムは区切られ、それぞれの部分が次のような方法で個別のアイテムとして扱われます――最初のものから最後から2番目のものはアイテム継続構造体（<firstterm>ItemContinuationData</firstterm>）に配置されます。この構造体は、次の部分とその部分自体を指すitemPointerDataを持っています。最後の部分は通常どおりに扱われます。
</para>

</chapter>
