Laramie nói đúng về bitmap và anh ấy liên kết đến đúng nơi trong sách hướng dẫn. Tuy nhiên, điều này gần như đúng, nhưng không hoàn toàn chính xác:
Vì vậy, đối với bất kỳ hàng nhất định nào có một hoặc nhiều null, kích thước được thêm vào đó sẽ là kích thước của bitmap (N bit cho bảng N-cột, được làm tròn lên).
Một yếu tố trong việc liên kết dữ liệu. HeapTupleHeader
(mỗi hàng) dài 23 byte, dữ liệu cột thực tế luôn bắt đầu bằng bội số của MAXALIGN
(thường là 8 byte). Điều đó để lại một byte đệm có thể được sử dụng bởi bitmap rỗng. Trên thực tế, Bộ nhớ NULL hoàn toàn miễn phí cho các bảng có tối đa 8 cột .
Sau đó, một MAXALIGN
khác (thường là 8) byte được phân bổ cho MAXALIGN * 8
tiếp theo (thường là 64) cột. Vv. Luôn cho tổng số cột người dùng ( tất cả hoặc không có gì ). Nhưng chỉ khi có ít nhất một giá trị NULL thực tế trong hàng.
Tôi đã chạy thử nghiệm rộng rãi để xác minh tất cả những điều đó. Thêm chi tiết:
- Không sử dụng NULL trong PostgreSQL vẫn sử dụng bitmap NULL trong tiêu đề?