mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-10-03 06:06:59 +02:00
ffb8f73890
output (from pdfjadetex). Also updated instructions to install documentation processing toolchain.
156 lines
4.0 KiB
Plaintext
156 lines
4.0 KiB
Plaintext
<chapter id="page">
|
|
|
|
<title>Page Files</title>
|
|
|
|
<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.
|
|
</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.
|
|
</para>
|
|
|
|
<para>
|
|
<xref linkend="page-table"> shows how pages in both normal <productname>Postgres</productname> tables
|
|
and <productname>Postgres</productname> indexes
|
|
(e.g., a B-tree index) are structured.
|
|
</para>
|
|
|
|
<table tocentry="1" id="page-table">
|
|
<title>Sample Page Layout</title>
|
|
<titleabbrev>Page Layout</titleabbrev>
|
|
<tgroup cols="2">
|
|
<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><quote>ItemData 2</quote></entry>
|
|
</row>
|
|
|
|
<row>
|
|
<entry><quote>ItemData 1</quote></entry>
|
|
</row>
|
|
|
|
<row>
|
|
<entry>ItemIdData</entry>
|
|
</row>
|
|
|
|
<row>
|
|
<entry>PageHeaderData</entry>
|
|
</row>
|
|
|
|
</tbody>
|
|
</tgroup>
|
|
</table>
|
|
|
|
<!--
|
|
.\" Running
|
|
.\" .q .../bin/dumpbpages
|
|
.\" or
|
|
.\" .q .../src/support/dumpbpages
|
|
.\" as the postgres superuser
|
|
.\" with the file paths associated with
|
|
.\" (heap or B-tree index) classes,
|
|
.\" .q .../data/base/<database-name>/<class-name>,
|
|
.\" will display the page structure used by the classes.
|
|
.\" Specifying the
|
|
.\" .q -r
|
|
.\" flag will cause the classes to be
|
|
.\" 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.
|
|
</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.
|
|
</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.
|
|
</para>
|
|
|
|
</chapter>
|