Rozdíl v době provádění dotazu je v tom, že první spuštění musí načíst mnohem více 8kB bloků z disku:porovnejte shared read=631496
a shared read=30359
.
PostgreSQL se rozhodne nepoužít index pro WHERE
podmínku, ale index, který podporuje ORDER BY
. Všimněte si, že kvůli IN
není možné použít jeden index pro oba WHERE
podmínku a ORDER BY
– to je možné pouze pro WHERE
podmínky, které používají =
jako operátor porovnání.
PostgreSQL si tedy musí vybrat a pravděpodobně udělá špatnou:protože jeho statistiky říkají optimalizátoru, že existuje mnoho řádků, které splňují WHERE
se rozhodne číst řádky v ORDER BY
objednejte a zlikvidujte ty, které neodpovídají WHERE
dokud nenajde 100 řádků výsledků. Bohužel se zdá, že odpovídající řádky nejsou blízko začátku tabulky a PostgreSQL musí skenovat mnoho řádků (Rows Removed by Filter: 17276154
).
Chcete-li to provést, použijte indexové skenování pro WHERE
podmínku, upravte ORDER BY
klauzule, aby PostgreSQL nemohl použít index:
ORDER BY datetime + INTERVAL '0 seconds' DESC
Protože zde není použití vícesloupcového indexu, nejlepší index by byl
CREATE INDEX ON report (sensor_id);