PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Không sử dụng NULL trong PostgreSQL vẫn sử dụng bitmap NULL trong tiêu đề?

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm thế nào để sử dụng ALIAS trong mệnh đề PostgreSQL ORDER BY?

  2. cách kiểm tra loại giá trị trong postgres

  3. Báo cáo xu hướng PostgreSQL 2019:Đám mây riêng và đám mây công cộng, Di chuyển, Kết hợp cơ sở dữ liệu &Lý do hàng đầu được sử dụng

  4. Chỉ mục chữ thường của Flask-SQLAlchemy - bỏ qua chức năng, không được phản ánh SQLAlchemy hỗ trợ

  5. Django duy nhất cùng nhau ràng buộc thất bại?