Các thông số chi phí của công cụ lập kế hoạch
Điều này cho tôi biết rằng random_page_cost
của bạn và seq_page_cost
có lẽ là sai. Bạn có thể đang sử dụng bộ nhớ với I / O ngẫu nhiên nhanh - bởi vì hầu hết cơ sở dữ liệu được lưu trong bộ nhớ cache trong RAM hoặc vì bạn đang sử dụng SSD, SAN có bộ nhớ đệm hoặc bộ lưu trữ khác mà I / O ngẫu nhiên vốn đã nhanh.
Hãy thử:
SET random_page_cost = 1;
SET seq_page_cost = 1.1;
để giảm đáng kể chênh lệch tham số chi phí và sau đó chạy lại. Nếu điều đó xảy ra, hãy xem xét việc thay đổi các thông số đó trong postgresql.conf.
.
Ước tính số hàng của bạn là hợp lý, vì vậy, nó không giống như vấn đề ước tính sai của người lập kế hoạch hoặc vấn đề với thống kê bảng không hợp lệ.
Truy vấn không chính xác
Truy vấn của bạn cũng không chính xác. OFFSET 0 LIMIT 1
không có ORDER BY
sẽ tạo ra kết quả không thể đoán trước trừ khi bạn được đảm bảo có chính xác một kết quả phù hợp, trong trường hợp đó, OFFSET ... LIMIT ...
các mệnh đề không cần thiết và có thể bị xóa hoàn toàn.
Bạn thường tốt hơn nhiều khi viết các truy vấn như SELECT max(...)
hoặc SELECT min(...)
có thể ở đâu; PostgreSQL sẽ có xu hướng có thể sử dụng một chỉ mục để loại bỏ giá trị mong muốn mà không cần thực hiện quét bảng đắt tiền hoặc quét chỉ mục và sắp xếp.
Mẹo
BTW, đối với các câu hỏi trong tương lai, wiki PostgreSQL có một số thông tin hữu ích trong danh mục hiệu suất và hướng dẫn đặt Câu hỏi truy vấn chậm .