SQLite-Dateistruktur

Ursprünglicher Autor: Offizielle Website
  • Übersetzung
In diesem Beitrag wird die SQLite-Datenbank im Kontext betrachtet. Sie finden Informationen zur Struktur der Datenbankdatei, zur Darstellung von Daten im Speicher sowie Informationen zur Struktur und Dateidarstellung des B-Baums.

Datenbank-Dateiformat


Die gesamte Datenbank wird in einer einzigen Datei auf der Festplatte gespeichert, die als "Hauptdatenbankdatei" bezeichnet wird. Während Transaktionen speichert SQLite zusätzliche Informationen in einer zweiten Datei: einem Rollback-Journal oder, wenn sich die Datenbank im WAL-Modus befindet, einer Protokolldatei mit Informationen zu Datensätzen. Wenn die Anwendung oder der Computer vor dem Ende der Transaktion heruntergefahren wird, werden diese Dateien als "Hot Journal" oder "Hot WAL-Datei" bezeichnet und enthalten die erforderlichen Informationen, um die Datenbank in einem konsistenten Zustand wiederherzustellen.

Seiten


Die Hauptdatenbankdatei besteht aus einer oder mehreren Seiten. Alle Seiten in einer Datenbank haben dieselbe Größe, die zwischen 512 und 65536 Byte liegen kann. Die Seitengröße für die Datenbankdatei wird durch eine 2-Byte-Ganzzahl mit einem Versatz von 16 Byte vom Anfang der Datenbankdatei bestimmt.
Alle Seiten sind von 1 bis 2147483646 nummeriert (2 ^ 31 - 2). Minimale Datenbankgröße: eine Seite mit 512 Bytes , maximale Datenbankgröße: 2147483646 Seiten mit 65536 Bytes ( ~ 140 TB ).

Überschrift


Die ersten 100 Bytes der Datenbankdatei enthalten den Datenbankheader, Tabelle 1 zeigt das Header-Schema.

Tabelle 1

Sperrbyte-Seite


Die Sperrseite ist eine Seite der Datenbankdatei und befindet sich zwischen den Offsets 0x1073741824 und 0x1073742335. Wenn die Größe der Datenbank kleiner ist, ist keine Sperrseite vorhanden. Diese Seite wird zum Implementieren von OS Interface Locking-Grundelementen benötigt.

Freelist


Die Liste der leeren Seiten ist als verknüpfte Liste organisiert. Jeder Listeneintrag besteht aus zwei Nummern mit jeweils 4 Bytes. Die erste Zahl bestimmt die Nummer des nächsten Elements der Freelist (Trunk Pointer) oder ist Null, wenn die Liste beendet ist. Die zweite Nummer ist ein Zeiger auf die Blattseitennummern. Die folgende Abbildung zeigt ein Diagramm dieser Struktur.



B - Baum


SQLite verwendet zwei Arten von Bäumen: "Tabelle B - Baum" (Daten werden auf Blättern gespeichert) und "Index B - Baum" (Schlüssel werden auf Blättern gespeichert).
Jeder Eintrag in der "Tabelle B - Struktur" besteht aus einem 64-Bit-Ganzzahlschlüssel und bis zu 2147483647 Bytes willkürlicher Daten. Der Schlüssel "Tabelle B - Baum" entspricht der ROWID der SQL-Tabelle.
Jeder Eintrag im "Index B - Baum" besteht aus einem beliebigen Schlüssel mit einer Länge von bis zu 2147483647 Bytes.

Seite B - Baum


Die B-Tree-Seite hat folgende Struktur:
  • Datenbankdatei-Header (100 Byte)
  • B-Tree-Seitentitel (8 oder 12 Bytes)
  • Array von Zellzeigern
  • Nicht zugewiesener Speicherplatz
  • Zellinhalt
  • Reservierter Platz


Die Kopfzeile der Datenbankdatei befindet sich nur auf der ersten Seite, die immer der alte Mann von "Tabelle B - Baum" ist. Alle anderen Seiten des B-Baums in der Datenbank haben diesen Header nicht.

Der B-Tree-Seitenkopf besteht aus 8 Bytes für Blattseiten und 12 Bytes für Innenseiten. Tabelle 2 zeigt die Struktur des Seitentitels.
Tabelle 2


Freeblock ist eine Struktur, mit der nicht zugeordneter Speicherplatz innerhalb einer B-Tree-Seite definiert wird. Freeblock ist in einer Kette organisiert. Die ersten 2 Bytes im Freeblock (vom höchsten zum niedrigsten), dies ist der Versatz zum nächsten Freeblock oder Null, wenn Freeblock der letzte in der Kette ist. Das dritte und vierte Byte ist eine Ganzzahl, die Größe des freien Blocks in Bytes, einschließlich eines Headers von 4 Bytes. Freeblocks sind immer in aufsteigender Reihenfolge der Verschiebung verbunden.

Die Anzahl der fragmentierten Bytes ist die Gesamtanzahl der nicht verwendeten Bytes im Zelleninhaltsbereich.

Ein Array von Zellzeigern besteht aus K 2-Byte-Ganzzahl-Offsets des Inhalts der Zellen (mit K Zellen im B-Baum). Das Array wird in aufsteigender Reihenfolge sortiert (vom kleinsten bis zum größten Schlüssel).

Nicht zugewiesener Speicherplatz ist der Bereich zwischen der letzten Zelle eines Zeigerarrays und dem Anfang der ersten Zelle.

Der reservierte Platz am Ende jeder Seite wird von Erweiterungen zum Speichern von Informationen über die Seite verwendet. Die Größe des reservierten Bereichs wird im Header der Datenbank festgelegt (Standardwert ist Null).

Repräsentativeation


Dieser Abschnitt beschreibt die Struktur der Datenspeicherung in der Datenbank. Die Daten auf den Blattseiten des Tabellen-B-Baums und der Index-B-Baum-Schlüssel werden in einer willkürlichen Folge von Bytes gespeichert, die als Datensatzformat bezeichnet wird (weitere Einzelheiten habrahabr.ru/post/223451 ).

Tisch


Jede Tabelle (mit ROWID) wird in der Datenbank als Tabelle b-Baum dargestellt . Jeder Eintrag in der Baumstruktur entspricht einer Zeile in der SQL-Tabelle. Eine Zeile der SQL-Tabelle wird als Sequenz (wie beim Erstellen angegeben) der Tabellenspalten im Datensatzformat dargestellt. Wenn die Tabelle einen INTEGER PRIMARY KEY hat, der ein Alias ​​von ROWID ist, wird anstelle seines Wertes NULL geschrieben. SQLite verwendet beim Zugriff auf den INTEGER PRIMARY KEY immer die Schlüsseltabelle b - tree anstelle von NULL. Wenn Affinitätsspalte (Empfehlung der Typkonvertierung, mehr Details habrahabr.ru/post/149635im Abschnitt "Datentypen und Vergleich von Werten") ist REAL und der Wert kann ohne Datenverlust in INTEGER konvertiert werden. Der Wert wird als Ganzzahl gespeichert. Beim Abrufen von Daten aus einer Datenbank konvertiert SQLite die Ganzzahl in REAL.

TISCH OHNE ROWID


Jede Tabelle (ohne ROWID) wird in der Datenbank als Index-B-Baum dargestellt . Der Unterschied zu Tabellen mit rowid besteht darin, dass der Schlüssel jedes SQL-Tabellendatensatzes im Datensatzformat gespeichert wird, wobei die Schlüsselspalten wie in PRIMARY KEY angegeben gespeichert werden und der Rest in der in der Tabellendeklaration angegebenen Reihenfolge.
Einträge im Index-B-Baum werden daher wie in Tabelle-B-Baum dargestellt , mit Ausnahme der Reihenfolge der Spalten und der Tatsache, dass der Inhalt der Zeile im Baumschlüssel gespeichert ist, und nicht als Daten auf den Blättern wie in Tabelle-B-Baum .

INDEX


Jeder Index (als CREATE INDEX, PRIMARY KEY oder UNIQUE deklariert) wird in Form eines Index-B-Baums in der Datenbank dargestellt . Jeder Datensatz in einem solchen Baum entspricht einer Zeile in der SQL-Tabelle. Ein Indexbaumschlüssel ist eine im Index angegebene Folge von Spaltenwerten und endet mit dem Wert des Zeilenschlüssels (Zeilen-ID oder Primärschlüssel) im Datensatzformat.

UPD 13:44 : Der Repräsentationsbereich wurde überarbeitet , danke für die Kritik an Mayorovp (Sie könnten sicherlich umziehen, aber na ja).

Nur registrierte Benutzer können an der Umfrage teilnehmen. Bitte komm rein .

Wie oft benutzt du SQLite?

  • 13,4% in 90% der Projekte 38
  • 17,6% in 50% der Projekte 50
  • 13,7% in 25% der Projekte 39
  • 34,2% Verwenden Sie sehr selten 97
  • 20,8% verwenden überhaupt nicht 59

Jetzt auch beliebt: