Váš výpočet je v několika bodech mimo.
- Velikost úložiště
varchar
,text
(acharacter
!) je cituje manuál ):
Tučné zdůraznění dolu na otázku v komentáři.
-
HeapTupleHeader zabírá 23 bajtů . Ale každá n-tice ("položka" - řádek nebo položka rejstříku) má identifikátor položky na začátku datové stránky k němu, celkem na zmíněných 27 bytech. Rozdíl je relevantní, protože skutečná uživatelská data začínají na násobku
MAXALIGN
od začátku každé položky a identifikátor položky se do tohoto posunu nezapočítává – stejně jako skutečná „velikost n-tice“. -
1 byte výplně kvůli zarovnání dat (násobek 8), které se v tomto případě používá pro bitmapu NULL.
-
Žádné odsazení pro typ
varchar
(ale další byte zmíněný výše)
Takže skutečný výpočet (se všemi sloupci vyplněnými na maximum) je:
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
Související:
- Neužívá se při použití NULL v PostgreSQL stále bitmapa NULL v záhlaví?
- Výpočet a úspora místa v PostgreSQL
Mnoho dalších najdete v seznamu odkazů napravo od těchto odpovědí.