Разликата във времето за изпълнение на заявката е, защото първото изпълнение трябва да прочете много повече 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);