Firebird für Datenbankexperten: Episode 2 - Seitentypen

<< Übersicht der Hauptzeichensätze in Firebird | Dokumentation | White Paper: Volle Kontrolle über den gesamten Entwicklungsprozess auch für Webanwendungen >>

Die deutschsprachige Dokumentation wird seit dem 26. Juli 2016 nicht mehr gepflegt. Aktuelle und vollständige Dokumentation finden Sie auf der englischsprachigen Webseite: IBExpert Documentation


Firebird für Datenbankexperten: Episode 2 - Seitentypen

von Ann Harrison

Datenbankdatei

Eine Firebird Datenbank ist eine Abfolge von Seiten mit festen Längen, die normalerweise alle in einer einzelnen Datei entahlten sind.

Verschiedene Seiten haben verschiedene Funktionen - in disem Fall ist die gelbe Seite der Datenbankkopf, gefolgt von einer PIP (Seiteninventarseite), der ungenutzten WAL, einer Zeigerseiter, einer Datenseite, dann abwechselnd Indexstammseite und Zeigerseiten. Die weiße Seite zeigt an, dass das Diagramm mehrere hundert Seiten überspringt und dann mit der Datenseite fortfährt.

Multidatei-Datenbank

Eine Multidatei Datenbank teilt die Abfolge in mehrere Dateien auf, jede mit einer Kopfseite. Abgesehen von der zusätzlichen Kopfseite, gibt es keinen Unterschied zwischen einer Multidatei-Datenbank und einer Einzeldatei-Datenbank.

Allgemeiner Seitenkopf

Jede Seite hat einen Kopf, der anzeigt, um welchen Seitentyp es sich handelt und weitere Informationen, die für alle Seiten gelten. Die meisten Seiten haben, dem Standardkopf folgend, zusätzliche Kopfinformationen. In dem Standardkopf ist das erste Byte, der Seitentyp.

Das nächste Byte beinhaltet Kennzeichen, spezifisch für den einzelnen Seitentypen. Zur Zeit verwenden nur Blobseiten und Indexseiten (b-trees) die Seitenkennzeichen. Andere Seitentypen - zum Beispiel die Kopfseite - haben zusätzlich einen separaten Bereich für Kennzeichen.

Die nächsten zwei Bytes waren eine Prüfsumme, enthalten aber jetzt immer den Wert 12345.

Die nächsten vier Bytes sind die Seitenerzeugung, die jedesmal, wenn die Seite geschrieben wird, inkrementiert werden.

Die nächsten acht Bytes sind für die Abfolge und die Ablage der Seiteneingabe in ein Protokoll reserviert. Das Protokoll-Projekt wurde eingestellt und diese Bytes warten jetzt auf eine sinnvolle Verwendung.

zurück zum Seitenanfang

Header page (HDR) - Kopfseite

Seitentyp 1 ist eine Kopfseite. Jede Datenbankdatei hat eine Kopfseite, in der Datei ist das die Seite 0.

Die erste Kopfseite in der Datenbank beschreibt die Datenbank: die Seitengröße?, die nächste Transaktions-ID?, verschiedene Einstellungen, etc.

DIe Kopfseiten von nachfolgenden Dateien in der Datenbank enthalten nur die Länge der laufenden Datei und den Namen der nächsten Datei.

Weiteres finden Sie auch unter Struktur einer Kopfseite?.

zurük zum Seitenanfang

Page Inventory Page (PIP) - Seiteninventarseite

Seitentyp 2 ist eine Page Inventory Page (PIP) - Seiteninventarseite?. PIPs verzeichnen zugeordnete und freie Seiten. Der Kopf einer PIP enthält den Abdruck auf dieser Seite des Bits, das die erste verfügbare Seite auf der PIP anzeigt.

Der Körper einer PIP enthält einen Array von einzelnen Bits, die den Status der Seiten in der DAtenbank reflektieren. Wenn das Bit 1 ist, ist die entsprechende Seite nicht in Gebrauch. Ist das Bit 0, ist die Seite in Gebrauch.

PIPs tauchen in regelmäßigen Abständen in der Datenbank auf, angefangen mit der Seite 1. Die letze Seite, die jeder PIP zugeordnet ist, ist die nächste PIP.

zurück zum Seitenanfang

Transaction Inventory Page (TIP) - Transaktionsinventarseite

Seitentyp 3 ist eine Transaction Information Page - Transaktionsinformationsseite, genannt Transaktionsinventarseite (TIP)?. Der TIP-Kopf enthält die Adresse der nächsten TIP.

Der Kopf einer TIP ist ein Array von Bitpaaren, die den Status der Transaktionen?. Wenn beide Bits 0 sind, die Transaktion ist aktiv oder noch nicht gestartet. Wenn beide Bits 1 sind, ist die Transaktion committed?. Wenn das erste Bit 1 ist und das zweite Bit 0, erfolgt ein Rollback? der Transaktion. Wenn das erste Bit 0 ist und das zweite 1, ist die Transaktion in Limbo?.

Limbo ist der Status einer Zwei-Phasen-Transaktion, die die erste Phase abgeschlossen hat, aber noch nicht die zweite.

zurück zum Seitenanfang

Pointer page (PTR) - Zeigerseite

Seitentyp 4 ist eine Zeigerseite. Jede Zeigerseite gehört zu einer bestimmten Tabelle und hat eine spezifische Sequenz innerhalb der Tabelle.

Die zusätzliche Kopfinformation enthält ihre Sequenz in der Zeigerseite für diese Tabelle, die Seitennummer der nächsten Zeigerseite für die Tabelle, die nächsten freien Stelle auf der Seite, die Anzahl der verwendeten Stellen auf der Seite, die Relations-ID der Tabelle, die Ablage der ersten Stelle auf der Seite, die anzeigt, dass die Seite nicht voll ist und die Ablage der letzten Stelle, die anzeigt, dass eine Datenseite nicht voll ist.

Zeigerseiten enthalten Arrays von 32-Bit-Integers, die die Seitenzahlen der Seiten in einer Tabelle enthalten. Unten auf der Zeigerseite zeigt ein Array von Bits die Füllhöhe jeder Seite an.

zurück zum Seitenanfang

Data Page (DPG) - Datenseite

Seitentyp 5 ist eine Datenseite. Jede Datenseite gehört zu einer bestimmten Tabelle.

Die zusätzliche Kopfinformation auf einer Datenseite ist die Position dieser Seite in der Liste der Datenseiten für Tabellen, die Relations-ID der Tabelle und die Anzahl der Einträge auf dieser Seite..

Der Körper einer Datenseite beginnt mit einem Array von 16-Bit-Wortpaaren. Der erste Teil des Paares ist die Ablage eines Datenteils auf der Seite - einem Datensatz, Blob, oder Datensatzfragmente. Der zweite Teil des Paares ist die Länge der Daten. Da mehr Daten auf der Seite gespeichert werden, wächst der Index abwärts.

Die Daten - Datensätze, Blobs und Fragmente - beginnen am Ende der Seite und gehen aufwärts.

Weitere Informationen finden Sie in den Kapiteln Structure of a data page (Struktur einer Datenseite) und Where do data pages come from (Woher kommen Datenseiten).

zurück zum Seitenanfang

Index Root page (IRT) - Indexstammseite

Seitentyp 6 ist eine Indexstammseite. Jede Tabelle hat eine einzige Indexstammseite, die die Indizes? für eine Tabelle beschreibt. Diese Seite beschreibt die in Firebird 1.5 und früher.

Die zusätzliche Kopfinformation für eine Indexstammseite ist der Identifizierer der Relation, zu der die Seite gehört und der Zählerstand für die Anzahl der Indizes für diese Tabelle.

Der Körper einer Indexstammseite enthält einen Array an Indexdeskriptoren, die von der oberen Seite kommen udn einen Array an Indexsegment-Despriptoren, die von unten kommen.

Jeder Indexdeskriptor beginnt mit der Selektivität, wenn der Index bereits erzeugt wurde, oder einer Transaktions-ID?, wenn der Index gerade erzeugt wird. Die nächsten 32-Bits sind die Seitennummer des obersten Teils des eigentlichen Indexes. Als nächstes kommt die 32-Bit-Ablage der Felddeskriptoren für den Index unten auf der Seite. Das nächste Byte ist die Anzahl der Schlüsselfelder, dann das Statusindikator-Byte.

Der Array der Segmentdeskriptoren enthält zwei Bytes pro Segment, eins für die Feld-ID und eins für den Feldtyp.

zurück zum Seitenanfang

B-tree page (BTR) - Indexseite/ B-Tree-Seite

Seitentyp 7 ist eine Indexseite oder B-Tree-Seite.

Alle Indizes in Firebird sind eine B-Tree-Variante, beginnend mit einer einzelnen Seite oben - verwirrenderweise Root (Stamm) genannt - verwirrend, weil der Stamm (Root) oben ist und weil der Stamm eines Indexes sich von der Tabellenindexstammseite unterscheidet.

Die zusätzlichen Kopfdaten auf einer B-Tree-Seite enthalten die Seitenzahl mit dem nächst höheren Wert für diesen Indexlevel, die Adresse der Seite mit dem nächst niedrigeren Werten für diesen Level, der gesamte Platz, der auf dieser Seite per Prefixkompression gespeichert wird, die Relations-ID der Tabelle, die dieser Index beschreibt, der genutzte Platz auf dieser Seite, der Identifizierer des Indexes an dem diese Seite beteiligt ist und der Level dieser Seite in dem Index.

Der Rest der Seite ist mit Indexeinträgen gefüllt.

zurück zum Seitenanfang

Blob page (BLP)- Blobseite

Seitentyp 8 ist eine Blobseite. Kleine Blobs weden auf Datenseiten. Blobs, die größer als eine Seite sind, werden auf einer Abfolge von Blobseiten gespeichert.

Die typische Kopfinformation für eine Blobseite enthält die Seitenzahl der ersten Seite dieses Blobs, die Position (Sequenz) dieser Seite in der Liste der Seiten, die den Blob enthalten, die Menge an Daten, die auf der Seite gespeichert sind und ein Pufferwort, das es den Blobdaten ermöglicht, an der Begrenzung zu einem langen Wort zu beginnen.

Der Rest der Seite enthält Blobdaten für einen einzelnen Blob.

zurück zum Seitenanfang

Generator page (GEN)- Generatorseite

Seitentyp 9 ist eine Generatorseite.

Im Kopf einer Generatorseite ist keine zusätzliche Information, aber es gibt mehrere ungenutzte Wörter. Ursprünglich waren Generatorseiten eine Untergruppe von Zeigerseiten und hatten nicht ihren eigenen Typ. Als Generatoren von 32 auf 63 Bit erweitert wurden, wurde es wichtig, einen separaten Seitentyp zu haben, aber die Änderung des Kopfes hätte die Entwertung alter Datenbanken zur Folge gehabt. Irgendwann sollten wir das korrigieren und der Generatorseite eine Sequenznummer hinzufügen.

Eine Generatorseite enthält einen Array von 64-Bit-Integern. Jedes Element des Arrays enthält den aktuellen Wert eines Generators.

Dieser Artikel wurde im Juni 2005 von Ann Harrison geschrieben. Die Urheberrechte liegen bei Frau Harrison und IBPhoenix.

zurück zum Seitenanfang
<< Übersicht der Hauptzeichensätze in Firebird | Dokumentation | White Paper: Volle Kontrolle über den gesamten Entwicklungsprozess auch für Webanwendungen >>