Разликата във времето за изпълнение на заявката е, защото първото изпълнение трябва да прочете много повече 8kB блокове от диска:сравнете shared read=631496
и shared read=30359
.
PostgreSQL решава да не използва индекса за WHERE
условие, но индексът, който поддържа ORDER BY
. Имайте предвид, че поради IN
не е възможно да се използва един индекс и за WHERE
условие и ORDER BY
– това е възможно само за WHERE
условия, които използват =
като оператор за сравнение.
Така че PostgreSQL трябва да направи избор и вероятно прави грешния избор:тъй като неговата статистика казва на оптимизатора, че има много редове, които отговарят на WHERE
условие, той решава да прочете редовете в ORDER BY
подредете и изхвърлете тези, които не отговарят на WHERE
условие, докато намери 100 реда с резултати. За съжаление, изглежда, че съответстващите редове не са близо до началото на таблицата и PostgreSQL трябва да сканира много редове (Rows Removed by Filter: 17276154
).
За да го направите, използвайте сканиране на индекс за WHERE
условие, променете ORDER BY
клауза, така че PostgreSQL да не може да използва индекс за него:
ORDER BY datetime + INTERVAL '0 seconds' DESC
Тъй като тук няма полза от индекс с няколко колони, най-добрият индекс би бил
CREATE INDEX ON report (sensor_id);