Вашето изчисление е отклонено в няколко точки.
- Размер за съхранение на
varchar
,text
(иcharacter
!) е, цитирайки ръководството ):
Удебелен акцент е мой, за да отговоря на въпроса в коментара.
-
HeapTupleHeader заема 23 байта . Но всеки кортеж („елемент“ – запис на ред или индекс) има идентификатор на елемент в началото на страницата с данни към него, общо на споменатите 27 байта. Разликата е уместна, тъй като действителните потребителски данни започват от кратно на
MAXALIGN
от началото на всеки елемент и идентификаторът на елемента не се брои срещу това отместване - както и действителния "размер на кортежа". -
1 байт запълване поради подравняване на данни (кратно на 8), което се използва за NULL bitmap в този случай.
-
Без подпълване за тип
varchar
(но допълнителния байт, споменат по-горе)
И така, действителното изчисление (с максимално попълнени колони) е:
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
Свързани:
- Неизползването на NULL в PostgreSQL все още ли използва растерно изображение NULL в заглавката?
- Изчисляване и спестяване на място в PostgreSQL
Ще намерите много повече в списъка с връзки вдясно от тези отговори.