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?
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:
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.
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