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