Laramie benar tentang bitmap dan dia menautkan ke tempat yang tepat di manual. Namun, ini hampir, tetapi tidak sepenuhnya benar:
Jadi untuk setiap baris tertentu dengan satu atau lebih null, ukuran yang ditambahkan padanya akan menjadi ukuran bitmap (N bit untuk tabel N-kolom, dibulatkan ke atas).
Seseorang harus memperhitungkan penyelarasan data. HeapTupleHeader
(per baris) panjangnya 23 byte, data kolom yang sebenarnya selalu dimulai dengan kelipatan MAXALIGN
(biasanya 8 byte). Itu menyisakan satu byte padding yang dapat digunakan oleh bitmap nol. Akibatnya penyimpanan NULL benar-benar gratis untuk tabel hingga 8 kolom .
Setelah itu, MAXALIGN
lagi (biasanya 8) byte dialokasikan untuk MAXALIGN * 8
berikutnya (biasanya 64) kolom. Dll. Selalu untuk jumlah total kolom pengguna (semua atau tidak sama sekali ). Tetapi hanya jika setidaknya ada satu nilai NULL aktual dalam baris.
Saya menjalankan tes ekstensif untuk memverifikasi semua itu. Selengkapnya:
- Apakah tidak menggunakan NULL di PostgreSQL masih menggunakan bitmap NULL di header?