A diferença no tempo de execução da consulta é porque a primeira execução precisa ler muito mais blocos de 8kB do disco:compare
shared read=631496 e shared read=30359 . PostgreSQL decide não usar o índice para
WHERE condição, mas o índice que suporta o ORDER BY . Observe que por causa do IN não é possível usar um índice tanto para WHERE condição e o ORDER BY – isso só é possível para WHERE condições que usam = como operador de comparação. Então o PostgreSQL tem que fazer uma escolha, e provavelmente faz a escolha errada:já que suas estatísticas dizem ao otimizador que existem muitas linhas que satisfazem o
WHERE condição, ele decide ler as linhas em ORDER BY ordenar e descartar os que não correspondem ao WHERE condição até encontrar 100 linhas de resultados. Infelizmente, parece que as linhas correspondentes não estão perto do início da tabela, e o PostgreSQL precisa varrer muitas linhas (Rows Removed by Filter: 17276154 ). Para fazê-lo, use uma varredura de índice para o
WHERE condição, modifique o ORDER BY cláusula para que o PostgreSQL não possa usar um índice para ela:ORDER BY datetime + INTERVAL '0 seconds' DESC
Como não há uso para um índice de várias colunas aqui, o melhor índice seria
CREATE INDEX ON report (sensor_id);