

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

El evento de espera LWLock:pg\$1stat\$1statements se produce cuando la extensión `pg_stat_statements` toma un bloqueo exclusivo en la tabla hash que rastrea las instrucciones SQL. Esto ocurre en las siguientes situaciones:
+ Cuando el número de instrucciones rastreadas alcanza el valor del parámetro `pg_stat_statements.max` configurado y es necesario dejar espacio para más entradas, la extensión realiza una clasificación del número de llamadas, elimina el 5 % de las instrucciones menos ejecutadas y vuelve a rellenar el hash con las entradas restantes.
+ Cuando `pg_stat_statements` realiza una operación de `garbage collection` en el archivo `pgss_query_texts.stat` del disco y lo vuelve a escribir.

**Topics**
+ [Versiones del motor admitidas](#apg-rpg-lwlockpgstat.supported)
+ [Contexto](#apg-rpg-lwlockpgstat.context)
+ [Causas probables del aumento de las esperas](#apg-rpg-lwlockpgstat.causes)
+ [Acciones](#apg-rpg-lwlockpgstat.actions)

## Versiones del motor admitidas
<a name="apg-rpg-lwlockpgstat.supported"></a>

 Esta información de eventos de espera es compatible con todas las versiones de Aurora PostgreSQL. 

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

**Descripción de la extensión pg\$1stat\$1statements**: la extensión pg\$1stat\$1statements rastrea las estadísticas de ejecución de instrucción SQL en una tabla hash. La extensión rastrea las instrucciones SQL hasta el límite definido por el parámetro `pg_stat_statements.max`. Este parámetro determina el número máximo de instrucciones que se pueden rastrear, lo que corresponde al número máximo de filas en la vista de pg\$1stat\$1statements.

**Persistencia de las estadísticas de las instrucciones**: la extensión mantiene las estadísticas de las instrucciones a través de reinicios de instancia mediante:
+ Escritura de datos en un archivo llamado pg\$1stat\$1statements.stat
+ Uso del parámetro pg\$1stat\$1statements.save para controlar el comportamiento de persistencia

Cuando pg\$1stat\$1statements.save se establece en:
+ activado (predeterminado): las estadísticas se guardan al apagar el servidor y se vuelven a cargar al iniciar el servidor
+ desactivado (predeterminado): las estadísticas no se guardan al apagar el servidor ni se vuelven a cargar al iniciar el servidor

**Almacenamiento de texto de consulta**: la extensión almacena el texto de las consultas rastreadas en un archivo denominado `pgss_query_texts.stat`. Este archivo puede crecer hasta duplicar el tamaño medio de todas las instrucciones SQL rastreadas antes de que se produzca la recopilación de elementos no utilizados. La extensión requiere un bloqueo exclusivo en la tabla de hash durante las operaciones de limpieza y reescritura del archivo `pgss_query_texts.stat`.

**Proceso de desasignación de instrucciones**: cuando el número de instrucciones rastreadas alcanza el límite `pg_stat_statements.max` y es necesario realizar un seguimiento de las nuevas, la extensión:
+ Toma un bloqueo exclusivo (LWLock:pg\$1stat\$1statements) en la tabla de hash.
+ Carga los datos existentes en la memoria local.
+ Realiza una clasificación rápida en función del número de llamadas.
+ Elimina las instrucciones menos solicitadas (el 5 % inferior).
+ Vuelve a rellenar la tabla hash con las entradas restantes.

**Supervisión de la desasignación de instrucciones**: en PostgreSQL 14 y versiones posteriores, puede supervisar la desasignación de las instrucciones mediante la vista pg\$1stat\$1statements\$1info. Esta vista incluye una columna dealloc que muestra cuántas veces se desasignaron las instrucciones para dejar espacio a otras nuevas

Si la desasignación de las instrucciones se produce con frecuencia, se realizará con más frecuencia la recopilación de elementos no utilizados del archivo `pgss_query_texts.stat` en el disco.

## Causas probables del aumento de las esperas
<a name="apg-rpg-lwlockpgstat.causes"></a>

Entre las causas típicas del aumento de las esperas de `LWLock:pg_stat_statements` se incluyen las siguientes:
+ Un aumento en el número de consultas únicas utilizadas por la aplicación.
+ El valor del parámetro `pg_stat_statements.max` es pequeño en comparación con el número de consultas únicas que se utilizan.

## Acciones
<a name="apg-rpg-lwlockpgstat.actions"></a>

Recomendamos diferentes acciones en función de las causas del evento de espera. Puede identificar los eventos de `LWLock:pg_stat_statements` mediante Información de rendimiento de Amazon RDS o consultando la vista de `pg_stat_activity`.

Ajuste los siguientes parámetros `pg_stat_statements` para controlar el comportamiento de seguimiento y reducir los eventos de espera de las instrucciones LWLock:pg\$1stat\$1statements.

**Topics**
+ [Desactivación del parámetro pg\$1stat\$1statements.track](#apg-rpg-lwlockpgstat.actions.disabletrack)
+ [Aumento del parámetro pg\$1stat\$1statements.max](#apg-rpg-lwlockpgstat.actions.increasemax)
+ [Desactivación del parámetro pg\$1stat\$1statements.track\$1utility](#apg-rpg-lwlockpgstat.actions.disableutility)

### Desactivación del parámetro pg\$1stat\$1statements.track
<a name="apg-rpg-lwlockpgstat.actions.disabletrack"></a>

Si el evento de espera de LWLock:pg\$1stat\$1statements está afectando negativamente al rendimiento de la base de datos y se requiere una solución rápida antes de continuar con el análisis de la vista de `pg_stat_statements` para identificar la causa raíz, el parámetro `pg_stat_statements.track` se puede desactivar configurándolo en `none`. Esto desactivará la recopilación de estadísticas de instrucciones.

### Aumento del parámetro pg\$1stat\$1statements.max
<a name="apg-rpg-lwlockpgstat.actions.increasemax"></a>

Para reducir la desasignación y minimizar la recopilación de elementos no utilizados del archivo `pgss_query_texts.stat` en el disco, aumente el valor del parámetro `pg_stat_statements.max`. El valor predeterminado es `5,000`.

**nota**  
El parámetro `pg_stat_statements.max` está estático. Debe reiniciar la instancia de base de datos para aplicar los cambios a este parámetro. 

### Desactivación del parámetro pg\$1stat\$1statements.track\$1utility
<a name="apg-rpg-lwlockpgstat.actions.disableutility"></a>

Puede analizar la vista de pg\$1stat\$1statements para determinar qué comandos de utilidad consumen la mayor cantidad de recursos rastreados por `pg_stat_statements`.

El parámetro `pg_stat_statements.track_utility` controla si el módulo realiza un seguimiento de los comandos de utilidad, que incluyen todos los comandos excepto SELECT, INSERT, UPDATE, DELETE y MERGE. Este parámetro está establecido en de forma predeterminada `on`.

Por ejemplo, cuando la aplicación utiliza muchas consultas de puntos de guardado, que son intrínsecamente únicas, puede aumentar la desasignación de instrucciones. Para abordar este problema, puede desactivar el parámetro `pg_stat_statements.track_utility` para impedir que `pg_stat_statements` realice un seguimiento de las consultas de puntos de guardado.

**nota**  
El parámetro `pg_stat_statements.track_utility` es un parámetro dinámico. Puede cambiar su valor sin necesidad de reiniciar la instancia de la base de datos.

**Example Ejemplo de consultas de punto de guardado únicas en 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
```

PostgreSQL 17 presenta varias mejoras para el seguimiento de comandos de utilidades:
+ Los nombres de los puntos de guardado ahora se muestran como constantes.
+ Los ID de transacción globales (GID) de los comandos de confirmación de dos fases ahora se muestran como constantes.
+ Los nombres de las instrucciones DEALLOCATE se muestran como constantes.
+ Los parámetros CALL ahora se muestran como constantes.