Seu cálculo está errado em vários pontos.
- Tamanho de armazenamento de
varchar
,text
(echaracter
!) é, citar o manual ):
A ênfase em negrito é minha para abordar a questão no comentário.
-
O HeapTupleHeader ocupa 23 bytes . Mas cada tupla ("item" - linha ou entrada de índice) tem um identificador de item no início da página de dados para ele, totalizando os 27 bytes mencionados. A distinção é relevante, pois os dados reais do usuário começam em um múltiplo deMAXALIGN
desde o início de cada item, e o identificador do item não conta para esse deslocamento - assim como o "tamanho da tupla" real.
-
1 byte de preenchimento devido ao alinhamento de dados (múltiplo de 8), que é usado para o bitmap NULL nesse caso.
-
Sem preenchimento para o tipovarchar
(mas o byte adicional mencionado acima)
Assim, o cálculo real (com todas as colunas preenchidas ao máximo) é:
23 -- heaptupleheader
+ 1 -- NULL bitmap (or padding if row has NO null values)
+ 9 -- columns ...
+ 101
+ 2
+ 101
+ 4
+ 11
-------------
252 bytes
+ 4 -- item identifier at page start
Relacionado:
- Não usar NULL no PostgreSQL ainda usa um bitmap NULL no cabeçalho?
- Calculando e economizando espaço no PostgreSQL
Você encontrará muito mais na lista de links à direita dessas respostas.