Sự khác biệt về thời gian thực thi truy vấn là do lần thực thi đầu tiên phải đọc nhiều khối 8kB hơn từ đĩa:so sánh shared read=631496
và shared read=30359
.
PostgreSQL quyết định không sử dụng chỉ mục cho WHERE
điều kiện, nhưng chỉ mục hỗ trợ ORDER BY
. Lưu ý rằng vì IN
không thể sử dụng một chỉ mục cho cả WHERE
điều kiện và ORDER BY
- điều đó chỉ có thể thực hiện được đối với WHERE
các điều kiện sử dụng =
làm toán tử so sánh.
Vì vậy, PostgreSQL phải đưa ra lựa chọn và có thể nó đã chọn sai:vì số liệu thống kê của nó cho trình tối ưu hóa biết rằng có nhiều hàng đáp ứng WHERE
điều kiện, nó quyết định đọc các hàng trong ORDER BY
đặt hàng và loại bỏ những cái không khớp với WHERE
điều kiện cho đến khi nó đã tìm thấy 100 hàng kết quả. Thật không may, có vẻ như các hàng phù hợp không gần với đầu bảng và PostgreSQL phải quét nhiều hàng (Rows Removed by Filter: 17276154
).
Để làm cho nó sử dụng quét chỉ mục cho WHERE
điều kiện, sửa đổi ORDER BY
để PostgreSQL không thể sử dụng chỉ mục cho nó:
ORDER BY datetime + INTERVAL '0 seconds' DESC
Vì không sử dụng chỉ mục nhiều cột ở đây, chỉ mục tốt nhất sẽ là
CREATE INDEX ON report (sensor_id);