En realidad es más complejo que eso.
El mapa de bits nulo necesita un bit por columna en la fila, redondeado a bytes completos. Solo está allí si la fila real incluye al menos un valor NULL y está completamente asignada en ese caso. NOT NULL
las restricciones no afectan directamente eso. (Por supuesto, si todos los campos de su tabla son NOT NULL
, nunca puede haber un mapa de bits nulo.)
El "encabezado de tupla de montón" (por fila) tiene una longitud de 23 bytes. Los datos reales comienzan en un múltiplo de MAXALIGN
(Alineación máxima de datos ) después de eso, que suele ser de 8 bytes en un sistema operativo de 64 bits (4 bytes en un sistema operativo de 32 bits). Ejecute el siguiente comando desde su directorio binario de PostgreSQL como root para obtener una respuesta definitiva:
./pg_controldata /path/to/my/dbcluster
En una instalación típica basada en Debian de Postgres 12 sería:
sudo /usr/lib/postgresql/12/bin/pg_controldata /var/lib/postgresql/12/main
De cualquier manera, hay un byte libre entre el encabezado y el inicio alineado de los datos, que puede utilizar el mapa de bits nulo. Siempre que su tabla tenga 8 columnas o menos , el almacenamiento NULL es efectivamente absolutamente gratuito (en lo que respecta al espacio en disco).
Después de eso, otro MAXALIGN
(típicamente 8 bytes) se asigna para que el mapa de bits nulo cubra otros (típicamente) 64 campos. Etc.
Esto es válido al menos para las versiones 8.4 - 12 y lo más probable es que no cambie.