Perhitungan Anda salah di beberapa titik.
- Ukuran penyimpanan
varchar
,text
(dancharacter
!) adalah, mengutip manual ):
Penekanan tebal saya untuk menjawab pertanyaan dalam komentar.
-
HeapTupleHeader menempati 23 byte . Tetapi setiap tuple ("item" - baris atau entri indeks) memiliki pengidentifikasi item di awal halaman data ke sana, dengan total 27 byte yang disebutkan. Perbedaannya relevan karena data pengguna yang sebenarnya dimulai pada kelipatan
MAXALIGN
dari awal setiap item, dan pengenal item tidak diperhitungkan terhadap offset ini - serta "ukuran tupel" yang sebenarnya. -
1 byte padding karena penyelarasan data (kelipatan 8), yang digunakan untuk bitmap NULL dalam kasus ini.
-
Tidak ada padding untuk tipe
varchar
(tetapi byte tambahan yang disebutkan di atas)
Jadi, perhitungan sebenarnya (dengan semua kolom terisi maksimal) adalah:
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
Terkait:
- Apakah tidak menggunakan NULL di PostgreSQL masih menggunakan bitmap NULL di header?
- Menghitung dan menghemat ruang di PostgreSQL
Anda akan menemukan lebih banyak lagi di daftar tautan di sebelah kanan jawaban ini.