Một chỉ mục một phần là một ý tưởng hay để loại trừ một nửa số hàng của bảng mà bạn rõ ràng không cần. Đơn giản hơn:
CREATE INDEX name_idx ON table (text_col)
WHERE text_col IS NOT NULL;
Đảm bảo chạy ANALYZE table
sau khi tạo chỉ mục. (Autovacuum sẽ tự động thực hiện điều đó sau một thời gian nếu bạn không thực hiện theo cách thủ công, nhưng nếu bạn kiểm tra ngay sau khi tạo, kiểm tra của bạn sẽ không thành công.)
Sau đó, để thuyết phục người lập kế hoạch truy vấn rằng một chỉ mục cụ thể có thể được sử dụng, hãy lặp lại WHERE
điều kiện trong truy vấn - ngay cả khi nó có vẻ hoàn toàn dư thừa:
SELECT col1,col2, .. colN
FROM table
WHERE text_col = 'my_value'
AND text_col IS NOT NULL; -- repeat condition
Voilá.
Theo tài liệu:
Tuy nhiên, hãy nhớ rằng vị từ phải phù hợp với các điều kiện được sử dụng trong các truy vấn được cho là có lợi từ chỉ mục. Để hiểu rõ hơn, chỉ mục một phần có thể được sử dụng trong truy vấn chỉ khi hệ thống không thể nhận ra rằng
WHERE
điều kiện của truy vấn hàm ý về mặt toán học đối với vị từ của chỉ mục. PostgreSQL không có một câu châm ngôn về định lý phức tạp có thể nhận ra các biểu thức tương đương về mặt toán học được viết ở các dạng khác nhau. (Không chỉ câu tục ngữ của định lý age Tang như vậy cực kỳ khó tạo, mà nó có thể là quá chậm để có thể sử dụng thực tế.) Hệ thống có thể nhận ra các hàm ý bất đẳng thức đơn giản, ví dụ:"x <1" có nghĩa là "x <2"; nếu không thì vị từ điều kiện phải khớp chính xác với một phần củaWHERE
của truy vấn điều kiện hoặc chỉ mục sẽ không được công nhận là có thể sử dụng được. Việc đối sánh diễn ra tại thời điểm lập kế hoạch truy vấn, không phải vào thời gian chạy. Như là kết quả, các mệnh đề truy vấn được tham số hóa không hoạt động với chỉ mục một phần.
Đối với các truy vấn được tham số hóa:một lần nữa, hãy thêm vị từ (dư thừa) của chỉ mục một phần dưới dạng một WHERE
bổ sung, không đổi điều kiện và nó hoạt động tốt.
Một bản cập nhật quan trọng trong Postgres 9.6 cải thiện phần lớn cơ hội cho chỉ quét chỉ mục (có thể làm cho các truy vấn rẻ hơn và người lập kế hoạch truy vấn sẽ dễ dàng chọn các kế hoạch truy vấn như vậy hơn). Có liên quan:
- PostgreSQL không sử dụng chỉ mục trong khi đếm (*)