(Theo dõi từ bài đăng này: Tại sao chỉ mục biểu thức PostgreSQL của tôi không được sử dụng khi tôi ĐẶT HÀNG B inNG trong một truy vấn con? )
PostgreQuery 9.5.
Tôi không thể tiết lộ chi tiết đầy đủ, nhưng table
có 22 cột và 5 chỉ mục:
- khóa chính ('pk'),
text
(btree) - khác
text
(btree) - một
timestamp with time zone
(btree) - một
tsvector
(gin) - cái mới nhất của tôi, một
bigint
(btree)
(Từ bài trước bạn biết rằng tôi đã cố gắng để tránh tạo ra cột bổ sung này, và chỉ sử dụng một chỉ số biểu hiện - thêm hai integer
cột với nhau -. Nhưng không thành công Các bigint
cột ở đây có lẽ có thể đã chỉ 'nguyên' nhưng tôi đã thực hiện một tạo ra nó, mất khoảng một giờ để thêm cột, điền vào nó và reindex, vì vậy tôi hy vọng điều này không liên quan nhưng chỉ đề cập đến nó trong trường hợp như vậy.)
Tất cả đều là btree ngoại trừ tsvector
.
Tất cả các truy vấn sau chỉ mất 12ms và chỉ sử dụng một Index Scan
:
SELECT pk FROM table ORDER BY pk DESC LIMIT 10
SELECT pk FROM table ORDER BY text_column DESC LIMIT 10
SELECT pk FROM table ORDER BY timestamp_column DESC LIMIT 10
Nhưng nếu tôi cố gắng sử dụng bigint
chỉ mục mới của mình cho ORDER BY
:
SELECT pk FROM table ORDER BY bigint_column DESC LIMIT 10
... phải mất 2,7 giây và sử dụng Limit -> Sort -> Seq Scan
.
Phương pháp "gian lận" của tôi là phương pháp gần nhất mà tôi dường như có thể sử dụng chỉ mục:
SELECT pk
FROM table
WHERE bigint_column > 1000000
ORDER BY bigint_column DESC LIMIT 10
Điều này mất 12ms và sử dụng Limit -> Sort -> Bitmap Heap Scan (bigint_column > 1000000) -> Bitmap Index Scan (bigint_column > 1000000)
.
Đây là sau VACUUM ANALYZE
khi thêm chỉ số.
Tôi nghĩ thật lạ khi chỉ số biểu hiện của tôi không được sử dụng trong câu hỏi khác. Bây giờ nó chỉ là một cột cũ đơn giản (tôi thậm chí chưa thêm những yếu tố cần thiết để thực sự đi theo con đường này.)
Tại sao chỉ mục mới nhất của tôi không được sử dụng, khi ba chỉ số kia hoạt động "tốt"? (Như đã chỉ ra trong các nhận xét tại https://dba.stackexchange.com/a/183290/28774 , Quét chỉ mục sẽ còn tốt hơn. Tôi không hiểu tại sao tất cả các truy vấn này sẽ không sử dụng ít nhất một Quét chỉ mục, huống chi là Quét chỉ mục, thay vì Quét Seq đầy đủ.)
Định nghĩa chỉ mục có DESC NULLS LAST
(mặc dù đó là cột không thể rỗng.)