Het is eigenlijk ingewikkelder dan dat.
De null-bitmap heeft één bit per kolom in de rij nodig, afgerond op hele bytes. Het is er alleen als de daadwerkelijke rij ten minste één NULL-waarde bevat en in dat geval volledig is toegewezen. NOT NULL
beperkingen hebben daar niet direct invloed op. (Natuurlijk, als alle velden van uw tabel NOT NULL
zijn , er kan nooit een null-bitmap zijn.)
De "heap tuple header" (per rij) is 23 bytes lang. Werkelijke gegevens beginnen bij een veelvoud van MAXALIGN
(Maximale gegevensuitlijning ) daarna, wat meestal 8 bytes is op 64-bits besturingssysteem (4 bytes op 32-bits besturingssysteem). Voer de volgende opdracht uit vanuit uw PostgreSQL binaire dir als root om een definitief antwoord te krijgen:
./pg_controldata /path/to/my/dbcluster
Op een typische Debian-gebaseerde installatie van Postgres 12 zou dat zijn:
sudo /usr/lib/postgresql/12/bin/pg_controldata /var/lib/postgresql/12/main
Hoe dan ook, er is één vrije byte tussen de kop en het uitgelijnde begin van de gegevens, die de null-bitmap kan gebruiken. Zolang uw tabel 8 kolommen of minder . heeft , NULL-opslag is effectief absoluut gratis (wat schijfruimte betreft).
Daarna nog een MAXALIGN
(meestal 8 bytes) wordt toegewezen aan de null-bitmap om nog eens (meestal) 64 velden te bestrijken. enz.
Dit is geldig voor ten minste versies 8.4 - 12 en zal hoogstwaarschijnlijk niet veranderen.