Nó thực sự phức tạp hơn thế.
Bitmap rỗng cần một bit cho mỗi cột trong hàng, được làm tròn đến đầy đủ các byte. Nó chỉ ở đó nếu hàng thực tế bao gồm ít nhất một giá trị NULL và được phân bổ đầy đủ trong trường hợp đó. NOT NULL
những ràng buộc không ảnh hưởng trực tiếp đến điều đó. (Tất nhiên, nếu tất cả các trường trong bảng của bạn NOT NULL
, không bao giờ có thể có một bitmap rỗng.)
"Tiêu đề heap tuple" (mỗi hàng) dài 23 byte. Dữ liệu thực tế bắt đầu bằng bội số của MAXALIGN
( Căn chỉnh dữ liệu tối đa ) sau đó, thường là 8 byte trên hệ điều hành 64-bit (4 byte trên hệ điều hành 32-bit). Chạy lệnh sau từ dir nhị phân PostgreSQL của bạn dưới dạng thư mục gốc để nhận được câu trả lời dứt khoát:
./pg_controldata /path/to/my/dbcluster
Trên bản cài đặt dựa trên Debian điển hình của Postgres 12 sẽ là:
sudo /usr/lib/postgresql/12/bin/pg_controldata /var/lib/postgresql/12/main
Dù bằng cách nào, có một byte trống giữa tiêu đề và phần bắt đầu được căn chỉnh của dữ liệu, mà bitmap rỗng có thể sử dụng. Miễn là bảng của bạn có 8 cột trở xuống , Bộ nhớ NULL hiệu quả hoàn toàn miễn phí (liên quan đến dung lượng ổ đĩa).
Sau đó, một MAXALIGN
khác (thường là 8 byte) được cấp phát cho bitmap rỗng để bao phủ 64 trường khác (thường là). Vv.
Điều này hợp lệ cho ít nhất phiên bản 8.4 - 12 và nhiều khả năng sẽ không thay đổi.