

# LWLock:pg\$1stat\$1statements
<a name="apg-rpg-lwlockpgstat"></a>

O evento de espera LWLock:pg\$1stat\$1statements 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ção `garbage collection` no arquivo `pgss_query_texts.stat` no disco e reescreve o arquivo.

**Topics**
+ [

## Versões compatíveis do mecanismo
](#apg-rpg-lwlockpgstat.supported)
+ [

## Contexto
](#apg-rpg-lwlockpgstat.context)
+ [

## Possíveis causas do maior número de esperas
](#apg-rpg-lwlockpgstat.causes)
+ [

## Ações
](#apg-rpg-lwlockpgstat.actions)

## Versões compatíveis do mecanismo
<a name="apg-rpg-lwlockpgstat.supported"></a>

 As informações sobre esse evento de espera são aceitas em todas as versões do Aurora PostgreSQL. 

## Contexto
<a name="apg-rpg-lwlockpgstat.context"></a>

**Conceitos básicos sobre a extensão pg\$1stat\$1statements**: 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\$1stat\$1statements.

**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\$1stat\$1statements.stat.
+ Usando o parâmetro pg\$1stat\$1statements.save para controlar o comportamento de persistência.

Quando pg\$1stat\$1statements.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\$1stat\$1statements) 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\$1stat\$1statements\$1info. 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
<a name="apg-rpg-lwlockpgstat.causes"></a>

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
<a name="apg-rpg-lwlockpgstat.actions"></a>

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\$1stat\$1.

**Topics**
+ [

### Desabilitar o parâmetro pg\$1stat\$1statements.track
](#apg-rpg-lwlockpgstat.actions.disabletrack)
+ [

### Aumentar o parâmetro pg\$1stat\$1statements.max
](#apg-rpg-lwlockpgstat.actions.increasemax)
+ [

### Desabilitar o parâmetro pg\$1stat\$1statements.track\$1utility
](#apg-rpg-lwlockpgstat.actions.disableutility)

### Desabilitar o parâmetro pg\$1stat\$1statements.track
<a name="apg-rpg-lwlockpgstat.actions.disabletrack"></a>

Se o evento de espera LWLock:pg\$1stat\$1statements 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\$1stat\$1statements.max
<a name="apg-rpg-lwlockpgstat.actions.increasemax"></a>

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\$1stat\$1statements.track\$1utility
<a name="apg-rpg-lwlockpgstat.actions.disableutility"></a>

Você pode analisar a visualização pg\$1stat\$1statements 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 por padrão `on`.

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.

**Example Exemplo de consultas exclusivas de ponto de salvamento em pg\$1stat\$1statements**  <a name="savepoint-queries"></a>

```
                     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.