Paging

Innerhalb eines Datenfiles sind Daten in 8kb Blöcken organisiert. Das Layout einer 8kb Seite sieht wie folgt aus. Die folgende ASCII Art entstammt dem entsprechenden Header File (bufpage.h):

A postgres disk page is an abstraction layered on top of a postgres
disk block (which is simply a unit of i/o, see block.h).

specifically, while a disk block can be unformatted, a postgres
disk page is always a slotted page of the form:

 +----------------+---------------------------------+
 | PageHeaderData | linp1 linp2 linp3 ...          
 +-----------+----+---------------------------------+
 | ... linpN |
 |
 +-----------+--------------------------------------+
 |               ^ pd_lower
 |
 |
 |
 |                     v pd_upper
 |
 +-------------+------------------------------------+
 |                     | tupleN ...
 |
 +-------------+------------------+-----------------+
 |       ... tuple3 tuple2 tuple1 | "special space" |
 +--------------------------------+-----------------+

Nach dem Page Header kommen linp-Elemente, die den Offset der Tuples innerhalb einer Page angeben. Wenn eine Page befüllt wird, werden Tuples von unten nach oben eingefügt - linp-Elemente werden von oben nach unten eingefügt. Treffen sich linp-Elemente und Tuple, ist die Page voll und ein neuer 8kb Block wird benötigt.

Am Ende gibt es noch einen sogenannten 'special space'. Im Fall von Tabellen wird dieser Platz nicht benötigt. Bei Indices wird dieser Platz jedoch benötigt, um auf die 'Nachbarpage' zu verweisen.

Innerhalb einer Page kann es klarerweise zu Fragmentierungen und dergleichen kommen. Aus diesem Grund ist es a priori sehr schwer möglich, den exakten Platzbedarf einer Datenbank abzuschätzen. Es hängt sehr stark von den zu speichernden Daten ab, wie effizient das Storage-System operiert.



http://www.postgresql.at