Na verdade, é mais complexo do que isso.
O bitmap nulo precisa de um bit por coluna na linha, arredondado para bytes completos. Só existe se a linha real incluir pelo menos um valor NULL e estiver totalmente alocada nesse caso.
NOT NULL
restrições não afetam diretamente isso. (Claro, se todos os campos da sua tabela forem NOT NULL
, nunca pode haver um bitmap nulo.) O "cabeçalho de tupla de heap" (por linha) tem 23 bytes. Os dados reais começam em um múltiplo de
MAXALIGN
(Alinhamento máximo de dados ) depois disso, que normalmente é de 8 bytes no sistema operacional de 64 bits (4 bytes no sistema operacional de 32 bits). Execute o seguinte comando do seu diretório binário do PostgreSQL como root para obter uma resposta definitiva:./pg_controldata /path/to/my/dbcluster
Em uma instalação típica do Postgres 12 baseada no Debian, isso seria:
sudo /usr/lib/postgresql/12/bin/pg_controldata /var/lib/postgresql/12/main
De qualquer forma, há um byte livre entre o cabeçalho e o início alinhado dos dados, que o bitmap nulo pode utilizar. Desde que sua tabela tenha 8 colunas ou menos , o armazenamento NULL é efetivamente absolutamente gratuito (no que diz respeito ao espaço em disco).
Depois disso, outro
MAXALIGN
(normalmente 8 bytes) é alocado para o bitmap nulo para cobrir outros (normalmente) 64 campos. etc. Isso é válido pelo menos para as versões 8.4 - 12 e provavelmente não será alterado.