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);