Je berekening klopt op verschillende punten niet.
- Opslaggrootte van
varchar
,text
(encharacter
!) is, die de handleiding citeert ):
Vetgedrukte nadruk van mij om de vraag in een opmerking te beantwoorden.
-
De HeapTupleHeader beslaat 23 bytes . Maar elke tuple ("item" - rij- of indexitem) heeft een item-ID aan het begin van de gegevenspagina ernaartoe, in totaal op de genoemde 27 bytes. Het onderscheid is relevant omdat de werkelijke gebruikersgegevens beginnen bij een veelvoud van
MAXALIGN
vanaf het begin van elk item, en de item-ID telt niet mee voor deze offset - evenals de werkelijke "tuple-grootte". -
1 byte opvulling vanwege gegevensuitlijning (veelvoud van 8), die in dit geval wordt gebruikt voor de NULL-bitmap.
-
Geen opvulling voor type
varchar
(maar de extra byte hierboven vermeld)
De werkelijke berekening (met alle kolommen tot het maximum gevuld) is dus:
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
Gerelateerd:
- Gebruikt het gebruik van NULL in PostgreSQL nog steeds een NULL-bitmap in de header?
- Ruimte berekenen en besparen in PostgreSQL
Je vindt er nog veel meer in de linklijst rechts van deze antwoorden.