Skillnaden i frågas exekveringstid beror på att den första exekveringen måste läsa mycket fler 8kB block från disken:jämför shared read=631496
och shared read=30359
.
PostgreSQL beslutar att inte använda indexet för WHERE
condition, men indexet som stöder ORDER BY
. Observera att på grund av IN
det är inte möjligt att använda ett index för både WHERE
skick och ORDER BY
– det är bara möjligt för WHERE
villkor som använder =
som jämförelseoperatör.
Så PostgreSQL måste göra ett val, och det gör förmodligen fel:eftersom dess statistik talar om för optimeraren att det finns många rader som uppfyller WHERE
villkor, bestämmer den sig för att läsa raderna i ORDER BY
beställ och kassera de som inte matchar WHERE
skick tills den har hittat 100 resultatrader. Tyvärr verkar det som om de matchande raderna inte är nära början av tabellen, och PostgreSQL måste skanna många rader (Rows Removed by Filter: 17276154
).
För att göra det använd en indexsökning efter WHERE
villkor, ändra ORDER BY
så att PostgreSQL inte kan använda ett index för det:
ORDER BY datetime + INTERVAL '0 seconds' DESC
Eftersom det inte finns någon användning för ett index med flera kolumner här, skulle det bästa indexet vara
CREATE INDEX ON report (sensor_id);