Ini sebenarnya lebih kompleks dari itu.
Bitmap nol membutuhkan satu bit per kolom di baris, dibulatkan ke byte penuh. Itu hanya ada jika baris aktual menyertakan setidaknya satu nilai NULL dan sepenuhnya dialokasikan dalam kasus itu. NOT NULL
kendala tidak secara langsung mempengaruhi itu. (Tentu saja, jika semua bidang tabel Anda NOT NULL
, tidak akan pernah ada bitmap nol.)
"Heap Tuple header" (per baris) panjangnya 23 byte. Data sebenarnya dimulai pada kelipatan MAXALIGN
(Penyelarasan data maksimum ) setelah itu, yang biasanya 8 byte pada OS 64-bit (4 byte pada OS 32-bit). Jalankan perintah berikut dari direktori biner PostgreSQL Anda sebagai root untuk mendapatkan jawaban yang pasti:
./pg_controldata /path/to/my/dbcluster
Pada penginstalan Postgres 12 berbasis Debian pada umumnya adalah:
sudo /usr/lib/postgresql/12/bin/pg_controldata /var/lib/postgresql/12/main
Either way, ada satu byte gratis antara header dan awal data yang selaras, yang dapat dimanfaatkan oleh bitmap nol. Selama tabel Anda memiliki 8 kolom atau kurang , penyimpanan NULL secara efektif benar-benar gratis (sejauh menyangkut ruang disk).
Setelah itu, MAXALIGN
lagi (biasanya 8 byte) dialokasikan untuk bitmap nol untuk mencakup (biasanya) 64 bidang lainnya. dll.
Ini berlaku untuk setidaknya versi 8.4 - 12 dan kemungkinan besar tidak akan berubah.