Laramie har rätt om bitmappen och han länkar till rätt plats i manualen. Ändå är detta nästan, men inte helt korrekt:
Så för en given rad med en eller flera nollor skulle storleken som läggs till den vara bitmappens (N bitar för en N-kolumntabell, avrundat uppåt).
Man måste ta hänsyn till dataanpassning. HeapTupleHeader
(per rad) är 23 byte lång, faktisk kolumndata börjar alltid med en multipel av MAXALIGN
(vanligtvis 8 byte). Det lämnar en byte av utfyllnad som kan användas av noll-bitmappen. I själva verket är NULL-lagring helt gratis för tabeller upp till 8 kolumner .
Efter det, ytterligare en MAXALIGN
(vanligtvis 8) byte tilldelas för nästa MAXALIGN * 8
(vanligtvis 64) kolumner. Etc. Alltid för det totala antalet användarkolumner (allt eller inget ). Men bara om det finns minst ett faktiskt NULL-värde i raden.
Jag körde omfattande tester för att verifiera allt detta. Mer information:
- Använder inte NULL i PostgreSQL fortfarande en NULL-bitmapp i rubriken?