Laramie ha ragione sulla bitmap e si collega al posto giusto nel manuale. Eppure, questo è quasi, ma non del tutto corretto:
Quindi, per ogni data riga con uno o più valori null, la dimensione aggiunta ad essa sarebbe quella della bitmap (N bit per una tabella a N colonne, arrotondata per eccesso).
Uno deve tenere conto dell'allineamento dei dati. Il HeapTupleHeader
(per riga) è lungo 23 byte, i dati effettivi della colonna iniziano sempre con un multiplo di MAXALIGN
(tipicamente 8 byte). Ciò lascia un byte di riempimento che può essere utilizzato dalla bitmap nulla. In effetti L'archiviazione NULL è assolutamente gratuita per le tabelle fino a 8 colonne .
Dopodiché, un altro MAXALIGN
(tipicamente 8) byte vengono allocati per il successivo MAXALIGN * 8
(in genere 64) colonne. Etc. Sempre per il numero totale di colonne utente (tutto o niente ). Ma solo se nella riga è presente almeno un valore NULL effettivo.
Ho eseguito test approfonditi per verificare tutto ciò. Maggiori dettagli:
- Non si usa NULL in PostgreSQL, utilizza ancora una bitmap NULL nell'intestazione?