Perhitungan ukuran baris jauh lebih rumit dari itu.
Penyimpanan biasanya dipartisi dalam halaman data8 kB . Ada overhead tetap kecil per halaman, kemungkinan sisa yang tidak cukup besar untuk memuat tupel lain, dan yang lebih penting adalah baris mati atau persentase yang awalnya dipesan dengan FILLFACTOR pengaturan.
Dan bahkan ada lebih banyak overhead per baris (tuple):pengenal item 4 byte di awal halaman, HeapTupleHeader dari 23 byte dan pading perataan . Awal tajuk tuple serta awal data tupel disejajarkan pada kelipatan MAXALIGN , yaitu 8 byte pada mesin 64-bit biasa. Beberapa tipe data memerlukan penyelarasan ke kelipatan 2, 4, atau 8 byte berikutnya.
Mengutip manual pada tabel sistem pg_tpye :
typalignadalah penyelarasan yang diperlukan saat menyimpan nilai jenis ini. Ini berlaku untuk penyimpanan di disk serta sebagian besar representasi nilai di dalam PostgreSQL. Ketika beberapa nilai disimpan secara berurutan, seperti dalam representasi baris lengkap pada disk, padding dimasukkan sebelum datum jenis ini sehingga dimulai pada batas yang ditentukan. Referensi keselarasan adalah awal dari datum pertama dalam urutan.Nilai yang mungkin adalah:
c=charpenyelarasan, yaitu, tidak diperlukan penyelarasan.
s=shortkeselarasan (2 byte pada sebagian besar mesin).
i=intkeselarasan (4 byte pada kebanyakan mesin).
d=doublekeselarasan (8 byte pada banyak mesin, tetapi tidak semuanya).
Baca tentang dasar-dasar dalam manual di sini.
Contoh Anda
Ini menghasilkan 4 byte padding setelah 3 integer kolom, karena timestamp kolom membutuhkan double penyelarasan dan harus dimulai pada kelipatan 8 byte berikutnya.
Jadi, satu baris menempati:
23 -- heaptupleheader
+ 1 -- padding or NULL bitmap
+ 12 -- 3 * integer (no alignment padding here)
+ 4 -- padding after 3rd integer
+ 8 -- timestamp
+ 0 -- no padding since tuple ends at multiple of MAXALIGN
Pengenal item plus per tuple di header halaman (seperti yang ditunjukkan oleh @A.H. di komentar):
+ 4 -- item identifier in page header
------
= 52 bytes
Jadi kita sampai pada 52 byte yang diamati .
Perhitungan pg_relation_size(tbl) / count(*) adalah perkiraan pesimis. pg_relation_size(tbl) termasuk mengasapi (baris mati) dan ruang yang disediakan oleh fillfactor , serta overhead per halaman data dan per tabel. (Dan kami bahkan tidak menyebutkan kompresi untuk varlena long yang panjang data dalam tabel TOAST, karena tidak berlaku di sini.)
Anda dapat menginstal modul tambahan pgstattuple dan memanggil SELECT * FROM pgstattuple('tbl_name'); untuk informasi lebih lanjut tentang tabel dan ukuran tupel.
Terkait:
- Ukuran tabel dengan tata letak halaman
- Menghitung dan menghemat ruang di PostgreSQL