PostgreSQL: COUNT (*) sử dụng quét tuần tự, không phải chỉ mục


12

Tại sao PostgreSQL tuần tự quét bảng để COUNT(*)truy vấn, trong khi có một khóa chính rất nhỏ và được lập chỉ mục?

Câu trả lời:


15

Các trang wiki chính thức đưa ra câu trả lời cho điều đó:

[...] Lý do tại sao điều này chậm có liên quan đến việc triển khai MVCC trong PostgreSQL. Thực tế là nhiều giao dịch có thể thấy các trạng thái khác nhau của dữ liệu có nghĩa là không thể có cách đơn giản nào để "COUNT (*)" tóm tắt dữ liệu trên toàn bộ bảng; PostgreSQL phải đi qua tất cả các hàng, theo một nghĩa nào đó. Điều này thường dẫn đến việc quét tuần tự đọc thông tin về mọi hàng trong bảng. [...]

Hơn nữa, bạn có thể thử ANALYZE để xây dựng lại thông tin cho trình lập kế hoạch truy vấn.

Bạn sẽ có được hiệu suất tốt hơn bằng cách sử dụng COUNT(an uniquly indexed field)nhưng nếu điều này là rất lớn, quét seq là cách duy nhất để làm điều đó.

Nếu bạn cần số rất nhanh và không sợ truy vấn lược đồ, bạn có thể làm như sau

SELECT reltuples FROM pg_class WHERE oid = 'your_table'::regclass

Nhưng đừng dựa vào các giá trị này vì nó chỉ là một số "bộ ước tính" (mặc dù thường là chính xác) trong bảng.


Tôi không nghĩ rằng điều này là chính xác. Tôi chưa đọc bất cứ điều gì ở bất cứ đâu, nơi COUNT(pk)sẽ cải thiện hiệu suất. Tôi nghĩ rằng nó sẽ luôn luôn thực hiện quét seq
vol7ron

1
Nếu không có mệnh đề where bạn đúng, quét seq sẽ được thực hiện. Với một lựa chọn đủ nơi mệnh đề postgresql CÓ THỂ sử dụng một chỉ mục, nhưng hãy nhớ rằng nó S back quay trở lại bảng để xác minh khả năng hiển thị của các bộ dữ liệu mà nó báo cáo.
Scott Marlowe
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.