¿No sigue usando NULL en PostgreSQL un bitmap NULL en el encabezado?

Aparentemente, PostgreSQL almacena un par de valores en el encabezado de cada fila de la base de datos .

Si no utilizo valores NULL en esa tabla, ¿el bitmap nulo aún está allí?
¿La definición de las columnas con NOT NULL hace alguna diferencia?

En realidad es más complejo que eso.

El bitmap nulo necesita un bit por columna en la fila, redondeado a bytes completos. Está solo allí si la fila real incluye al menos un valor NULL y está totalmente asignada en ese caso. NOT NULL restricciones NOT NULL no afectan directamente eso. (Por supuesto, si todos los campos de su tabla NOT NULL son NOT NULL , nunca puede haber un bitmap nulo).

El “encabezado de la tupla del montón” (por fila) tiene 23 bytes de longitud. Los datos reales comienzan en un múltiplo de MAXALIGN después de eso, que generalmente es de 8 bytes en el sistema operativo de 64 bits (4 bytes en el sistema operativo de 32 bits). Ejecute el siguiente comando desde su directorio binario de PostgreSQL como raíz para obtener una respuesta definitiva:

 ./pg_controldata /path/to/my/dbcluster 

En una instalación típica de Debian de Postgres 9.3 que sería:

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

De cualquier manera, hay un byte libre entre el encabezado y el inicio alineado de los datos, que el bitmap nulo puede utilizar. 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 el bitmap nulo (más relleno) para cubrir otros 64 campos (típicamente). Etc.

Esto es válido para al menos las versiones 8.4 – 9.6 y lo más probable es que no cambie.

El bitmap nulo solo está presente si el bit HEAP_HASNULL está establecido en t_infomask. Si está presente, comienza justo después del encabezado fijo y ocupa suficientes bytes para tener un bit por columna de datos (es decir, t_natts bits en total). En esta lista de bits, un bit de 1 indica que no es nulo, un bit de 0 es un valor nulo. Cuando el bitmap no está presente, se supone que todas las columnas no son nulas.

http://www.postgresql.org/docs/9.0/static/storage-page-layout.html#HEAPTUPLEHEADERDATA-TABLE

entonces por cada 8 columnas usa un byte de almacenamiento adicional. Luego, por cada millón de filas que tomarían un megabyte de almacenamiento. Realmente no parece tan importante. Definiría las tablas cómo debían definirse y no me preocuparía por los encabezados nulos.