LWLock:pg_stat_statements
O evento de espera LWLock:pg_stat_statements ocorre quando a extensão pg_stat_statements
obtém um bloqueio exclusivo na tabela de hash que rastreia instruções SQL. Isso acontece nos seguintes cenários:
-
Quando o número de instruções rastreadas atinge o valor configurado do parâmetro
pg_stat_statements.max
e é necessário abrir espaço para mais entradas, a extensão executa uma classificação no número de chamadas, remove 5% das instruções menos executadas e preenche novamente o hash com as entradas restantes. -
Quando
pg_stat_statements
executa uma operaçãogarbage collection
no arquivopgss_query_texts.stat
no disco e reescreve o arquivo.
Versões compatíveis do mecanismo
É possível obter informações sobre eventos de espera em todas as versões do RDS para PostgreSQL.
Contexto
Conceitos básicos sobre a extensão pg_stat_statements: essa extensão rastreia as estatísticas de execução de instruções SQL em uma tabela de hash. Ela rastreia as instruções SQL até o limite definido pelo parâmetro pg_stat_statements.max
. Esse parâmetro determina o número máximo de instruções que podem ser rastreadas, o qual corresponde ao número máximo de linhas na visualização pg_stat_statements.
Persistência das estatísticas de instrução: a extensão mantém as estatísticas da instrução em todas as reinicializações da instância:
-
Gravando dados em um arquivo chamado pg_stat_statements.stat.
-
Usando o parâmetro pg_stat_statements.save para controlar o comportamento de persistência.
Quando pg_stat_statements.save é definido como:
-
ativado (padrão): as estatísticas são salvas no desligamento e recarregadas na inicialização do servidor.
-
desativado: as estatísticas não são salvas no desligamento nem recarregadas na inicialização do servidor.
Armazenamento de texto de consulta: a extensão armazena o texto das consultas rastreadas em um arquivo chamado pgss_query_texts.stat
. Esse arquivo pode aumentar até o dobro do tamanho médio de todas as instruções SQL rastreadas antes que a coleta de resíduos ocorra. A extensão requer um bloqueio exclusivo na tabela de hash durante as operações de limpeza e regravação do arquivo pgss_query_texts.stat
.
Processo de desalocação de instruções: quando o número de instruções rastreadas atinge o limite pg_stat_statements.max
e novas instruções precisam ser rastreadas, a extensão:
-
Obtém um bloqueio exclusivo (LWLock:pg_stat_statements) na tabela de hash.
-
Carrega os dados existentes na memória local.
-
Executa uma classificação rápida com base no número de chamadas.
-
Remove as instruções menos chamadas (5% inferiores).
-
Preenche novamente a tabela de hash com as entradas restantes.
Monitoramento da desalocação de instruções: no PostgreSQL 14 e versões posteriores, você pode monitorar a desalocação de instruções usando a visualização pg_stat_statements_info. Essa visualização inclui uma coluna de desalocação que mostra quantas vezes as instruções foram desalocadas para abrir espaço para novas.
Se a desalocação de instruções ocorrer com frequência, haverá uma coleta de resíduos mais frequente do arquivo pgss_query_texts.stat
no disco.
Possíveis causas do maior número de esperas
As causas típicas do aumento de esperas LWLock:pg_stat_statements
incluem:
-
Um aumento no número de consultas exclusivas usadas pela aplicação.
-
O valor do parâmetro
pg_stat_statements.max
é pequeno em comparação ao número de consultas exclusivas que estão sendo usadas.
Ações
Recomenda-se ações distintas, dependendo dos motivos do evento de espera. Você pode identificar eventos LWLock:pg_stat_statements
utilizando o Insights de Performance do Amazon RDS ou consultando a visualização pg_stat_activity
.
Ajuste os parâmetros pg_stat_statements
a seguir para controlar o comportamento de rastreamento e reduzir os eventos de espera das instruções LWLock:pg_stat_.
Tópicos
Desabilitar o parâmetro pg_stat_statements.track
Se o evento de espera LWLock:pg_stat_statements estiver afetando negativamente o desempenho do banco de dados e for necessária uma solução rápida antes de uma análise mais aprofundada da visualização pg_stat_statements
para identificar a causa-raiz, o parâmetro pg_stat_statements.track
poderá ser desabilitado configurando-o como none
. Isso desabilitará a coleta de estatísticas de instrução.
Aumentar o parâmetro pg_stat_statements.max
Para reduzir a desalocação e minimizar a coleta de resíduos do arquivo pgss_query_texts.stat
no disco, aumente o valor do parâmetro pg_stat_statements.max
. O valor padrão é 5,000
.
nota
O parâmetro pg_stat_statements.max
é estático. É necessário reinicializar a instância de banco de dados para aplicar qualquer alteração nesse parâmetro.
Desabilitar o parâmetro pg_stat_statements.track_utility
Você pode analisar a visualização pg_stat_statements para determinar quais comandos do utilitário estão consumindo mais recursos rastreados por pg_stat_statements
.
O parâmetro pg_stat_statements.track_utility
controla se o módulo rastreia os comandos do utilitário, que incluem todos os comandos, exceto SELECT, INSERT, UPDATE, DELETE e MERGE. Esse parâmetro é definido como on
por padrão.
Por exemplo, quando sua aplicação usa muitas consultas de ponto de salvamento, que são inerentemente exclusivas, ela pode aumentar a desalocação de instruções. Para resolver isso, você pode desabilitar o parâmetro pg_stat_statements.track_utility
para impedir que pg_stat_statements
rastreie consultas de pontos de salvamento.
nota
O parâmetro pg_stat_statements.track_utility
é dinâmico. Você pode alterar o respectivo valor sem reiniciar a instância de banco de dados.
exemplo Exemplo de consultas exclusivas de ponto de salvamento em pg_stat_statements
query | queryid
-------------------------------------------------+---------------------
SAVEPOINT JDBC_SAVEPOINT_495701 | -7249565344517699703
SAVEPOINT JDBC_SAVEPOINT_1320 | -1572997038849006629
SAVEPOINT JDBC_SAVEPOINT_26739 | 54791337410474486
SAVEPOINT JDBC_SAVEPOINT_1294466 | 8170064357463507593
ROLLBACK TO SAVEPOINT JDBC_SAVEPOINT_65016 | -33608214779996400
SAVEPOINT JDBC_SAVEPOINT_14185 | -2175035613806809562
SAVEPOINT JDBC_SAVEPOINT_45837 | -6201592986750645383
SAVEPOINT JDBC_SAVEPOINT_1324 | 6388797791882029332
O PostgreSQL 17 inclui vários aprimoramentos para o rastreamento de comandos de utilitário:
-
Os nomes de ponto de salvamento agora são exibidos como constantes.
-
Os IDs de transação global (GIDs) dos comandos de confirmação em duas fases agora são exibidos como constantes.
-
Os nomes das instruções DEALLOCATE são mostrados como constantes.
-
Os parâmetros CALL agora são exibidos como constantes.