Ihre Berechnung ist an mehreren Stellen falsch.
- Speichergröße von
varchar
,text
(undcharacter
!) ist, das Handbuch zitierend ):
Fette Hervorhebung von mir, um die Frage im Kommentar anzusprechen.
-
Der HeapTupleHeader belegt 23 Bytes . Aber jedes Tupel ("Element" - Zeile oder Indexeintrag) hat eine Elementkennung am Anfang der Datenseite dazu, in Höhe der genannten 27 Bytes. Die Unterscheidung ist relevant, da tatsächliche Benutzerdaten bei einem Vielfachen von
MAXALIGN
beginnen vom Anfang jedes Elements, und die Elementkennung zählt nicht zu diesem Offset - ebenso wie die tatsächliche "Tupelgröße". -
1 Byte Padding wegen Datenausrichtung (Vielfaches von 8), das in diesem Fall für die NULL-Bitmap verwendet wird.
-
Kein Padding für den Typ
varchar
(aber das oben erwähnte zusätzliche Byte)
Die eigentliche Berechnung (mit maximal gefüllten Spalten) lautet also:
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
Verwandte:
- Verwendet die Verwendung von NULL in PostgreSQL nicht immer noch eine NULL-Bitmap im Header?
- Berechnung und Einsparung von Speicherplatz in PostgreSQL
Viele weitere finden Sie in der Linkliste rechts neben diesen Antworten.