PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Não usar NULL no PostgreSQL ainda usa um bitmap NULL no cabeçalho?


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.