Din beräkning är avstängd vid flera punkter.
- Lagringsstorlek för
varchar
,text
(ochcharacter
!) är, citerar manualen ):
Djärv betoning min för att ta upp frågan i kommentaren.
-
HeapTupleHeader upptar 23 byte . Men varje tuppel ("objekt" - rad eller indexpost) har en objektidentifierare i början av datasidan till den, totalt på de nämnda 27 byten. Distinktionen är relevant eftersom faktisk användardata börjar med en multipel av
MAXALIGN
från början av varje artikel, och artikelidentifieraren räknas inte mot denna förskjutning - liksom den faktiska "tuppelstorleken". -
1 byte utfyllnad på grund av datajustering (multipel av 8), som används för NULL-bitmappen i det här fallet.
-
Ingen utfyllnad för typ
varchar
(men den extra byten som nämns ovan)
Så den faktiska beräkningen (med alla kolumner fyllda till max) är:
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
Relaterat:
- Använder inte NULL i PostgreSQL fortfarande en NULL-bitmapp i rubriken?
- Beräkna och spara utrymme i PostgreSQL
Du hittar många fler i länklistan till höger om dessa svar.