Laramie hat Recht mit der Bitmap und er verlinkt an der richtigen Stelle im Handbuch. Dies ist jedoch fast, aber nicht ganz richtig:
Für jede gegebene Zeile mit einer oder mehreren Nullen wäre die hinzugefügte Größe also die der Bitmap (N Bits für eine N-Spalten-Tabelle, aufgerundet).
Man muss den Datenabgleich berücksichtigen. Der HeapTupleHeader
(pro Zeile) ist 23 Byte lang, tatsächliche Spaltendaten beginnen immer bei einem Vielfachen von MAXALIGN
(normalerweise 8 Bytes). Dadurch bleibt ein Füllbyte übrig, das von der Null-Bitmap verwendet werden kann. Tatsächlich ist NULL-Speicher für Tabellen mit bis zu 8 Spalten absolut kostenlos .
Danach noch ein MAXALIGN
(typischerweise 8) Bytes werden für den nächsten MAXALIGN * 8
zugewiesen (normalerweise 64) Spalten. Etc. Immer für die Gesamtzahl der Benutzerspalten (alles oder nichts ). Aber nur, wenn es mindestens einen tatsächlichen NULL-Wert in der Zeile gibt.
Ich habe umfangreiche Tests durchgeführt, um all das zu überprüfen. Weitere Einzelheiten:
- Verwendet die Nichtverwendung von NULL in PostgreSQL immer noch eine NULL-Bitmap im Header?