Votre calcul est faussé à plusieurs endroits.
- Taille de stockage de
varchar
,text
(etcharacter
!) est, citant le manuel ):
J'insiste en gras pour répondre à la question dans les commentaires.
-
Le HeapTupleHeader occupe 23 octets . Mais chaque tuple ("élément" - ligne ou entrée d'index) a un identifiant d'élément au début de la page de données, totalisant les 27 octets mentionnés. La distinction est pertinente car les données utilisateur réelles commencent à un multiple de
MAXALIGN
depuis le début de chaque élément, et l'identifiant de l'élément n'est pas pris en compte dans ce décalage - ainsi que la "taille de tuple" réelle. -
1 octet de remplissage dû à l'alignement des données (multiple de 8), qui est utilisé pour le bitmap NULL dans ce cas.
-
Pas de rembourrage pour le type
varchar
(mais l'octet supplémentaire mentionné ci-dessus)
Ainsi, le calcul réel (avec toutes les colonnes remplies au maximum) est :
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
Connexe :
- L'utilisation de NULL dans PostgreSQL n'utilise-t-elle pas toujours un bitmap NULL dans l'en-tête ?
- Calculer et économiser de l'espace dans PostgreSQL
Vous en trouverez beaucoup plus dans la liste de liens à droite de ces réponses.