PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Parâmetro de configuração work_mem no PostgreSQL no Linux


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.