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

PostgreSQL không sử dụng chỉ mục một phần

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ủa WHERE 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 (*)


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. pg gem '0.14.0' trên Mountain Lion không thành công

  2. Tối ưu hóa truy vấn Postgres (buộc quét chỉ mục)

  3. Nhận thời gian thực thi của truy vấn PostgreSQL

  4. Làm cách nào để chỉ cài đặt các công cụ máy khách cho PostgreSQL trên Windows?

  5. Các hàng trùng lặp trong một bảng khóa chính.