Laramie a raison sur le bitmap et il renvoie au bon endroit dans le manuel. Pourtant, c'est presque, mais pas tout à fait correct :
Ainsi, pour toute ligne donnée avec un ou plusieurs NULL, la taille ajoutée serait celle du bitmap (N bits pour un tableau à N colonnes, arrondi).
Il faut tenir compte de l'alignement des données. Le HeapTupleHeader
(par ligne) a une longueur de 23 octets, les données de colonne réelles commencent toujours à un multiple de MAXALIGN
(généralement 8 octets). Cela laisse un octet de remplissage qui peut être utilisé par le bitmap nul. En effet, le stockage NULL est absolument gratuit pour les tables jusqu'à 8 colonnes .
Après cela, un autre MAXALIGN
(typiquement 8) octets sont alloués pour le prochain MAXALIGN * 8
(généralement 64) colonnes. Etc. Toujours pour le nombre total de colonnes utilisateur (tout ou rien ). Mais seulement s'il y a au moins une valeur NULL réelle dans la ligne.
J'ai effectué des tests approfondis pour vérifier tout cela. Plus de détails :
- L'utilisation de NULL dans PostgreSQL n'utilise-t-elle pas toujours un bitmap NULL dans l'en-tête ?