Parâmetros de custo do planejador
Isso me diz que seu
random_page_cost
e seq_page_cost
provavelmente estão errados. Você provavelmente está em armazenamento com E/S aleatória rápida - porque a maior parte do banco de dados é armazenada em cache na RAM ou porque você está usando SSD, SAN com cache ou outro armazenamento em que a E/S aleatória é inerentemente rápida. Tentar:
SET random_page_cost = 1;
SET seq_page_cost = 1.1;
para reduzir bastante as diferenças de parâmetros de custo e, em seguida, executar novamente. Se isso funcionar, considere alterar esses parâmetros em
postgresql.conf.
. Suas estimativas de contagem de linhas são razoáveis, portanto, não parece um problema de estimativa incorreta do planejador ou um problema com estatísticas de tabela incorretas.
Consulta incorreta
Sua consulta também está incorreta.
OFFSET 0 LIMIT 1
sem um ORDER BY
produzirá resultados imprevisíveis, a menos que você tenha exatamente uma correspondência, nesse caso o OFFSET ... LIMIT ...
cláusulas são desnecessárias e podem ser removidas inteiramente. Geralmente, é muito melhor formular consultas como
SELECT max(...)
ou SELECT min(...)
sempre que possível; O PostgreSQL tenderá a ser capaz de usar um índice apenas para extrair o valor desejado sem fazer uma varredura de tabela cara ou uma varredura e classificação de índice. Dicas
BTW, para perguntas futuras, o wiki do PostgreSQL tem algumas boas informações na categoria de desempenho e um guia para fazer perguntas de consulta lenta .