Det er faktisk mere komplekst end som så.
Null-bitmap'et har brug for en bit pr. kolonne i rækken, rundet op til hele bytes. Den er der kun, hvis den faktiske række indeholder mindst én NULL-værdi og i så fald er fuldt allokeret. NOT NULL
begrænsninger påvirker ikke direkte det. (Selvfølgelig, hvis alle felter i din tabel er NOT NULL
, der kan aldrig være en null bitmap.)
"Heap tuple header" (pr. række) er 23 bytes lang. Faktiske data starter ved et multiplum af MAXALIGN
(Maksimal datajustering ) efter det, hvilket typisk er 8 bytes på 64-bit OS (4 bytes på 32-bit OS). Kør følgende kommando fra din PostgreSQL binære katalog som root for at få et endeligt svar:
./pg_controldata /path/to/my/dbcluster
På en typisk Debian-baseret installation af Postgres 12 ville det være:
sudo /usr/lib/postgresql/12/bin/pg_controldata /var/lib/postgresql/12/main
Uanset hvad, er der én ledig byte mellem headeren og den justerede start af dataene, som null-bitmap kan bruge. Så længe din tabel har 8 kolonner eller færre , NULL-lagring er faktisk helt gratis (hvad angår diskplads).
Derefter en anden MAXALIGN
(typisk 8 bytes) er allokeret til null bitmap til at dække yderligere (typisk) 64 felter. osv.
Dette er gyldigt for mindst version 8.4 - 12 og vil højst sandsynligt ikke ændre sig.