On 31-10-2016 15:59, Marcio Meneguzzi wrote:

[Você perguntou no privado mas a sua dúvida pode servir para outros aqui]

> select distinct data_itens from itens where codigo = 1 and 
> data_itens between '01/01/2016' and '12/31/2016' order by data_itens
> 
Você não mostrou a quantidade de registros mas como o outro colega
comentou, um índice em data_itens pode ajudar se a seletividade for boa
(note que 'Rows Removed by Filter' é alto).

> O que estou fazendo de "errado" e como posso melhorar isto?
> 
Sim. Mas é preciso trazer os dados do disco para a cache do PostgreSQL.

Provavelmente você reiniciou o serviço ou o sistema operacional. No caso
do serviço, você perde a cache do postgres. No caso do sistema
operacional, você perde tanto a cache do postgres quanto a cache feita
pelo sistema operacional.

A primeira execução vai ser lenta porque os dados estão no disco (os
dados precisam ir para cache do SO e cache do postgres). O postgres só
manipula dados que estão na sua cache; se eles não estão lá tem que ser
colocados lá (a partir da cache do SO, que é na memória, ou do disco).

Você não informou a versão, mas o pg_prewarm [1] (>= 9.4) pode ajudar na
tarefa de popular a cache antes que o acesso ao sistema seja liberado.
Aliado a isso, você pode usar o pg_hibernator [2] para persistir a cache
do postgres se tiver que reiniciar o serviço ou mesmo o servidor. Uma
outra opção é o pgfincore [3] que lida somente com a cache do sistema
operacional.


[1] https://www.postgresql.org/docs/9.6/static/pgprewarm.html
[2] https://github.com/gurjeet/pg_hibernator
[3] https://github.com/klando/pgfincore


-- 
   Euler Taveira                   Timbira - http://www.timbira.com.br/
   PostgreSQL: Consultoria, Desenvolvimento, Suporte 24x7 e Treinamento
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a