Laramie har ret med hensyn til bitmap, og han linker til det rigtige sted i manualen. Alligevel er dette næsten, men ikke helt korrekt:
Så for en given række med en eller flere nuller, vil størrelsen, der føjes til den, være den for bitmap'et (N bits for en N-kolonnetabel, rundet op).
Man skal tage højde for datatilpasning. HeapTupleHeader
(pr. række) er 23 bytes lang, faktiske kolonnedata starter altid med et multiplum af MAXALIGN
(typisk 8 bytes). Det efterlader en byte af polstring, der kan bruges af null bitmap. Faktisk er NULL-lagerplads helt gratis for tabeller op til 8 kolonner .
Derefter en anden MAXALIGN
(typisk 8) bytes allokeres til den næste MAXALIGN * 8
(typisk 64) kolonner. Osv. Altid for det samlede antal brugerkolonner (alt eller intet ). Men kun hvis der er mindst én faktisk NULL-værdi i rækken.
Jeg kørte omfattende test for at bekræfte alt det. Flere detaljer:
- Bruger der ikke brug af NULL i PostgreSQL stadig en NULL bitmap i headeren?