PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Non si utilizza NULL in PostgreSQL utilizza ancora una bitmap NULL nell'intestazione?

In realtà è più complesso di così.

La bitmap nulla richiede un bit per colonna nella riga, arrotondato per eccesso a byte interi. È presente solo se la riga effettiva include almeno un valore NULL ed è completamente allocata in quel caso. NOT NULL i vincoli non lo influenzano direttamente. (Ovviamente, se tutti i campi della tabella sono NOT NULL , non può mai esserci una bitmap nulla.)

L'"intestazione della tupla dell'heap" (per riga) è lunga 23 byte. I dati effettivi iniziano con un multiplo di MAXALIGN (Allineamento massimo dei dati ) dopo quello, che è in genere 8 byte su OS a 64 bit (4 byte su OS a 32 bit). Esegui il seguente comando dalla directory binaria di PostgreSQL come root per ottenere una risposta definitiva:

./pg_controldata /path/to/my/dbcluster

Su una tipica installazione basata su Debian di Postgres 12 sarebbe:

sudo /usr/lib/postgresql/12/bin/pg_controldata /var/lib/postgresql/12/main

In ogni caso, c'è un byte libero tra l'intestazione e l'inizio allineato dei dati, che può essere utilizzato dalla bitmap nulla. A condizione che la tua tabella abbia 8 colonne o meno , lo spazio di archiviazione NULL è effettivamente assolutamente gratuito (per quanto riguarda lo spazio su disco).

Dopodiché, un altro MAXALIGN (in genere 8 byte) viene allocato per la bitmap nulla per coprire altri (in genere) 64 campi. ecc.

Questo è valido per almeno le versioni 8.4 - 12 e molto probabilmente non cambierà.