Giá trị NULL
có được chỉ mục hay không phụ thuộc ít nhất vào loại chỉ mục. Về cơ bản, đây sẽ là YES cho btree
và gist
loại chỉ số, NO cho hash
, và có vẻ như YES hoặc NO cho gin
loại chỉ số tùy thuộc vào phiên bản PostgreSQL.
Đã từng là cột boolean amindexnulls
trong bảng pg_catalog.pg_am
mang thông tin đó nhưng đã biến mất trong 9.1. Có lẽ vì các chỉ mục thậm chí còn tinh vi hơn trong các cải tiến PG.
Trong trường hợp cụ thể của dữ liệu, cách tốt nhất để biết là đo lường sự khác biệt về kích thước của chỉ mục, sử dụng hàm pg_relation_size('index_name')
, giữa nội dung hoàn toàn NULL và hoàn toàn NOT NULL, với phiên bản PG chính xác, datatype chính xác, loại chỉ mục chính xác và định nghĩa. Và biết rằng có thể, một thay đổi trong tương lai trong bất kỳ tham số nào có thể thay đổi kết quả.
Nhưng trong mọi trường hợp, nếu bạn "chỉ là" muốn tránh NULLs lập chỉ mục, nó luôn luôn có thể tạo ra một chỉ số phần:
CREATE INDEX partial_idx(col) ON table WHERE (col is not null)
Điều này sẽ mất ít không gian, nhưng liệu điều này sẽ trợ giúp hay không với hiệu suất của các truy vấn phụ thuộc vào các truy vấn này.
Nguồn
2012-08-27 17:16:08
"Bộ nhớ NULL hoàn toàn miễn phí đối với các bảng có 8 cột trở xuống". - Điều gì sẽ xảy ra nếu chỉ có 1 cột giữ giá trị rỗng? điều này có nghĩa là bitmap rỗng với 1 byte sẽ được tạo chỉ để giữ 1 bit? – Dejell
bitmap rỗng là có nếu có bất kỳ giá trị null, với đủ byte để bao gồm tất cả các cột, cộng với đệm để bội số tiếp theo của 'MAXALIGN'. –
Cảm ơn Erwin. Vẫn không chắc chắn - nếu tôi không có bất kỳ giá trị null nào? nó vẫn ở đó chứ? (nhiều đến nhiều bảng) – Dejell