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.