Eu postei seu plano de consulta em explain.depesz.com, dê uma olhada.
As estimativas do planejador de consulta estão terrivelmente erradas em alguns lugares. Você executou
ANALYZE
recentemente? Leia os capítulos do manual sobre Estatísticas Usadas pelo Planejador e Constantes de Custo do Planejador. Preste atenção especial aos capítulos sobre
random_page_cost
e default_statistics_target
.Você pode tentar:
ALTER TABLE diplomas ALTER COLUMN number SET STATISTICS 1000;
ANALYZE diplomas;
Ou vá ainda mais alto para uma tabela com 10 milhões de linhas. Depende da distribuição de dados e das consultas reais . Experimentar. O padrão é 100, o máximo é 10.000.
Para um banco de dados desse tamanho, apenas 1 ou 5 MB de
work_mem
geralmente não são suficientes. Leia a página do Postgres Wiki sobre Tuning Postgres ao qual @aleroot vinculou. Como sua consulta precisa de 430104kB de memória em disco de acordo com
EXPLAIN
saída, você deve definir work_mem
para algo como 500 MB ou mais para permitir a classificação na memória. A representação de dados na memória precisa de mais espaço do que a representação em disco. Você pode estar interessado no que Tom Lane postou recentemente sobre esse assunto. Aumentando
work_mem
por um pouco, como você tentou, não vai ajudar muito ou pode até desacelerar. Defini-lo como alto globalmente pode até prejudicar, especialmente com acesso simultâneo. Várias sessões podem se privar de recursos. Alocar mais para um propósito tira memória de outro se o recurso for limitado. A melhor configuração depende da situação completa. Para evitar efeitos colaterais, apenas defina-o alto o suficiente localmente em sua sessão e temporariamente para a consulta:
SET work_mem = '500MB';
Redefina-o para o padrão depois:
RESET work_mem;
Ou use
SET LOCAL
para defini-lo apenas para a transação atual para começar.