Quero resolver os problemas de desempenho causados por um evento de espera LWLock:pg_stat_statement no meu Amazon Relational Database Service (Amazon RDS) para PostgreSQL ou em minha edição do Amazon Aurora compatível com PostgreSQL.
Resolução
O módulo pg_stat_statements rastreia as estatísticas sobre instruções SQL. Para instâncias de banco de dados PostgreSQL compatíveis com o PostgreSQL 11 ou posterior, a biblioteca pg_stat_statements é carregada por padrão. Para mais informações, consulte pg_stat_statements no site do PostgreSQL.
Quando o número de instruções exclusivas rastreadas excede o valor de pg_stat_statements.max, o PostgreSQL desaloca estatísticas para as consultas menos executadas da tabela de hash na memória compartilhada. A desalocação cria espaço para novas entradas.
Durante a desalocação, o PostgreSQL usa LWLock para a tabela de hash para impedir o acesso simultâneo. Isso pode bloquear processos de backend simultâneos e é possível ver o evento de espera LWLock:pg_stat_statements em Insights de Performance.
Observação: se a tabela de hash alocar entradas com frequência, o desempenho geral do workload poderá diminuir.
Aumentar o módulo pg_stat_statements.max
Para reduzir os eventos de espera de LWLock:pg_stat_statements, aumente o valor de pg_stat_statements.max no grupo de parâmetros. Para mais informações, consulte pg_stat_statements.max no site do PostgreSQL.
Observação: quando você aumenta o valor de pg_stat_statements.max, a tabela de hash consome memória compartilhada adicional para armazenar mais informações da instrução SQL.
Para o Amazon RDS para PostgreSQL, é possível modificar pg_stat_statements.max no grupo de parâmetros de banco de dados.
Para a edição compatível com Aurora PostgreSQL, é possível modificar o valor no grupo de parâmetros do cluster de banco de dados ou no grupo de parâmetros de banco de dados.
Depois de modificar pg_stat_statements.max no grupo de parâmetros, reinicialize a instância de banco de dados para aplicar a alteração. Durante a reinicialização, pode haver uma breve interrupção. Para mais informações, consulte Reinicializar uma instância de banco de dados: etapas básicas e Reinicializar uma instância de banco de dados em um cluster do Aurora.
Não é possível modificar parâmetros no grupo de parâmetros de banco de dados padrão ou no grupo de parâmetros de cluster de banco de dados padrão. Para modificar parâmetros em grupos padrão, crie um grupo de parâmetros de banco de dados personalizado ou um grupo de parâmetros de cluster de banco de dados personalizado. Em seguida, associe-o à sua instância de banco de dados ou cluster de banco de dados.
Observação: é possível armazenar textos de consulta longos em um arquivo de disco separado. Se o arquivo ficar muito grande devido ao tamanho da consulta ou aos altos valores de pg_stat_statements.max, todos os textos da consulta poderão ser descartados. Em seguida, os campos de pg_stat_statements.query podem ficar vazios. Para mais informações, consulte pg_stat_statements -- acompanhar estatísticas de planejamento e execução de SQL no site do PostgreSQL.
Reduzir as entradas de pg_stat_statements
É uma prática recomendada usar o PostgreSQL versão 17 para reduzir as entradas de pg_stat_statements. Por exemplo, ao usar as versões 17 e posteriores do PostgreSQL, é possível substituir nomes constantes de SAVEPOINT por espaços reservados. Por exemplo, é possível salvar SAVEPOINT sp1 e SAVEPOINT sp2 como duas entradas diferentes de pg_stat_statements em versões anteriores do PostgreSQL. No entanto, nas versões 17 e posteriores do PostgreSQL, essas duas instruções são armazenadas como uma entrada, por exemplo, como SAVEPOINT $1. Para mais informações, consulte pg_stat_statements no site do PostgreSQL.
Se não for possível fazer o upgrade para a versão 17 ou posterior do PostgreSQL, verifique se a aplicação, Mapeadores relacionais de objetos (ORMs) e drivers de banco de dados emitem automaticamente SQL, como comandos SAVEPOINT. Esses comandos SAVEPOINT automáticos podem aumentar o número de entradas de pg_stat_statements.
Verificar quantas desalocações ocorreram
PostgreSQL versões 14 e posteriores
Para verificar o número total de vezes que a desalocação ocorreu, revise a coluna dealloc da visualização pg_stat_statements_info. É possível usar essas informações para ajustar pg_stat_statements.max de acordo. Para mais informações, consulte a visualização pg_stat_statements_info no site do PostgreSQL.
Para verificar o número de desalocações em determinado período, selecione a visualização pg_stat_statements_info periodicamente e, em seguida, calcule a diferença de pg_stat_statements_info.dealloc.
Ao selecionar a visualização pg_stat_statements_info, você pode receber a mensagem de erro “ERROR: relation ‘pg_stat_statements_info’ does not exist”. Esse erro ocorre quando pg_stat_statements carrega somente na memória, mas não é instalado em seu banco de dados. Para resolver esse erro, instale a extensão pg_stat_statements no banco de dados ao qual a aplicação se conecta. Conecte-se ao banco de dados e execute a seguinte instrução SQL para instalar pg_stat_statements no banco de dados:
CREATE EXTENSION pg_stat_statements;
Para mais informações, consulte CREATE EXTENSION no site do PostgreSQL.