PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Wird NULL in PostgreSQL nicht verwendet, wird immer noch eine NULL-Bitmap im Header verwendet?

Es ist tatsächlich komplexer als das.

Die Null-Bitmap benötigt ein Bit pro Spalte in der Zeile, aufgerundet auf volle Bytes. Es ist nur vorhanden, wenn die aktuelle Zeile mindestens einen NULL-Wert enthält und in diesem Fall vollständig belegt ist. NOT NULL Einschränkungen wirken sich nicht direkt darauf aus. (Natürlich, wenn alle Felder Ihrer Tabelle NOT NULL sind , es darf niemals eine Null-Bitmap geben.)

Der "Heap Tuple Header" (pro Zeile) ist 23 Bytes lang. Tatsächliche Daten beginnen bei einem Vielfachen von MAXALIGN (Maximale Datenausrichtung ) danach, was normalerweise 8 Bytes auf 64-Bit-Betriebssystemen (4 Bytes auf 32-Bit-Betriebssystemen) sind. Führen Sie den folgenden Befehl von Ihrem PostgreSQL-Binärverzeichnis als root aus, um eine endgültige Antwort zu erhalten:

./pg_controldata /path/to/my/dbcluster

Bei einer typischen Debian-basierten Installation von Postgres 12 wäre das:

sudo /usr/lib/postgresql/12/bin/pg_controldata /var/lib/postgresql/12/main

In jedem Fall gibt es ein freies Byte zwischen dem Header und dem ausgerichteten Beginn der Daten, das die Null-Bitmap verwenden kann. Solange Ihre Tabelle 8 Spalten oder weniger hat , NULL-Speicher ist praktisch absolut kostenlos (was den Speicherplatz betrifft).

Danach noch ein MAXALIGN (typischerweise 8 Bytes) wird der Null-Bitmap zugewiesen, um weitere (typischerweise) 64 Felder abzudecken. usw.

Dies gilt mindestens für die Versionen 8.4 - 12 und wird sich höchstwahrscheinlich nicht ändern.