2 Platzsparende Techniken für größensensitive Datenbanken

April 30

Raima-Logo auf grauem Hintergrund

Hier sind zwei einfache, aber nicht offensichtliche Änderungen, die Sie an Ihrer DDL vornehmen können, um die Größe Ihrer Datenbankdateien zu verringern. Einige interessante Erklärungen der Interna von RDM zeigen, warum dies funktioniert, und ermöglichen es Ihnen, in all Ihren Datenbankdesigns bessere DDL-Entscheidungen zu treffen.

Betrachten Sie die folgende SQL-DDL:

Datenbank EventTrace erstellen
kreisförmige Tabelle erstellen TraceTab (
     deviceId smallint,
     lowPoint real,
     maxLevel double
) maxrows = 8000

Die Größe auf der Festplatte (oder im Arbeitsspeicher) für diese Zeile beträgt 32 Byte. Es sieht so aus, als ob es 14 Bytes sein sollte, mit 2 für das Smallint, 4 für das Real und 8 für das Double. Woher kommen die zusätzlichen 18 Bytes? Wenn Ihre Datenbank größenabhängig ist, kann es hilfreich sein, eine kurze Lektion über die Interna dieses DBMS zu erhalten.

Jede Zeile / jeder Datensatz in RDM hat einen Header, der aus dem Datensatztyp (2 Byte) und seiner eigenen Datenbankadresse (8 Byte) besteht. Nach der Kopfzeile werden die Zeilendaten in einem C-ausgerichteten Layout angezeigt. Dies bedeutet bei den meisten Compilern, dass jedes Element so ausgerichtet wird, dass es sich an einer N-Byte-Grenze befindet, wobei N die Größe des Elements ist. Das heißt, ein 8-Byte-Double beginnt an einer 8-Byte-Grenze, 4 an 4 und 2 an 2. Die für die obige DDL definierte Struktur muss zwischen dem Smallint und dem Real und erneut zwischen dem Real und dem Real aufgefüllt werden doppelt, kostet 2 + 4 = 6 Füllbytes für jede Zeile.

Erste Technik: Ordnen Sie die Spalten- / Felddefinitionen nach Größe an, vom größten zum kleinsten.

Unsere Standard-Datenbankadresse (interner Zeiger auf den Aufzeichnungssteckplatz) beträgt 8 Byte (wie oben erwähnt) und ermöglicht bis zu 281 Billionen Zeilen in einer Datei. Sie können die Standardeinstellung überschreiben und eine 4-Byte-Datenbankadresse verwenden, die bis zu 16,7 Millionen Datensätze zulässt, was normalerweise mehr als ausreichend ist. Sagen Sie dazu nach dem Datenbanknamen "dba4". Jetzt ist der Header 6 Bytes anstatt 10, und Sie haben weitere 4 Bytes pro Zeile gespeichert. Der Header ist in einem DBMS wichtig, da er zur Konsistenz- / Korruptionsprüfung verwendet werden kann.

Zweite Technik: Verwenden Sie "dba4", wenn Sie wissen, dass eine Tabelle nicht mehr als 16,7 Millionen Zeilen enthält.

Zu Ihrer Information, jede Zeile hat ein zusätzliches Byte, das zum Speichern von NULL-Flags verwendet wird, ein Bit für jede Spalte. Wenn Sie mehr als 8 Spalten haben, wird ein zweites Byte usw. verwendet.

Jetzt sieht die DDL so aus:

Datenbank erstellen EventTrace dba4
kreisförmige Tabelle erstellen TraceTab (
     maxLevel double,
     lowPoint real,
     deviceId smallint
) maxrows = 8000


Die Gesamtlänge unserer neu definierten, aber äquivalenten Zeile beträgt also:

2 Datensatztyp
4 Datenbankadresse
8 erste Spalte (maxLevel)
4 zweite Spalte (lowPoint)
2 dritte Spalte (deviceId)
1 Nullspaltenbits

21 Gesamtbytes / Zeile

Noch eine FYI: Wenn Zeilen in Seitenschlitzen mit fester Länge platziert werden, werden sie immer in gerade Adressen eingeteilt. Dies reduziert die Anzahl der von der Laufzeitbibliothek benötigten Speicheroperationen erheblich. Die Größe dieser Zeile beträgt also 22 Byte, und 46 davon passen auf eine 1024-Byte-Seite.

Alle oben genannten Punkte gelten für eine Nicht-SQL-Datenbankdefinition, mit einer Ausnahme: Es gibt kein NULL-Flags-Byte. Die Syntax der DDL ist natürlich unterschiedlich, bedeutet aber dasselbe.

Get notified about new RDM updates

Be the first to know about new Raima Database Manager updates when they go live, use cases, industry trends and more.