Quiero resolver los problemas de rendimiento causados por un evento de espera LWLock:pg_stat_statements en mi base de datos de Amazon Relational Database Service (Amazon RDS) para PostgreSQL o la edición de Amazon Aurora compatible con PostgreSQL.
Resolución
El módulo pg_stat_statements hace un seguimiento de las estadísticas sobre las instrucciones SQL. En el caso de las instancias de base de datos de PostgreSQL que son compatibles con PostgreSQL 11 o versiones posteriores, la biblioteca pg_stat_statements se carga de forma predeterminada. Para obtener más información, consulta pg_stat_statements en el sitio web de PostgreSQL.
Cuando el número de instrucciones únicas de las que se ha hecho un seguimiento supera el valor de pg_stat_statements.max, PostgreSQL anula la asignación de las estadísticas de la tabla de hash de la memoria compartida para las consultas que se ejecutan con menos frecuencia. Al anular la asignación, se crea espacio para nuevas entradas.
Durante la anulación de la asignación, PostgreSQL usa LWLock para la tabla de hash a fin de evitar el acceso simultáneo. Esto podría bloquear los procesos de backend simultáneos y es posible que veas el evento de espera LWLock:pg_stat_statements en Información de rendimiento.
Nota: Si la tabla de hash asigna entradas con frecuencia, el rendimiento general de la carga de trabajo podría empeorar.
Aumento del módulo pg_stat_statements.max
Para reducir los eventos de espera LWLock:pg_stat_statements, aumenta el valor de pg_stat_statements.max en el grupo de parámetros. Para obtener más información, consulta pg_stat_statements.max en el sitio web de PostgreSQL.
Nota: Al aumentar el valor de pg_stat_statements.max, la tabla de hash consume memoria compartida adicional para almacenar más información sobre las instrucciones SQL.
En el caso de Amazon RDS para PostgreSQL, puedes modificar pg_stat_statements.max en el grupo de parámetros de base de datos.
En el caso de Aurora compatible con PostgreSQL, puedes modificar el valor en el grupo de parámetros del clúster de base de datos o en el grupo de parámetros de base de datos.
Tras modificar pg_stat_statements.max en el grupo de parámetros, reinicia la instancia de base de datos para aplicar el cambio. Durante el reinicio, es posible que se produzca una breve interrupción. Para obtener más información, consulta Reinicio de una instancia de base de datos: pasos básicos y Reinicio de una instancia de base de datos dentro de un clúster de Aurora.
No puedes modificar los parámetros del grupo de parámetros de base de datos predeterminado o del grupo de parámetros del clúster de base de datos predeterminado. Para modificar los parámetros de los grupos predeterminados, crea un grupo de parámetros de base de datos personalizado o un grupo de parámetros de clúster de base de datos personalizado. A continuación, asócialo a tu instancia de base de datos o clúster de base de datos.
Nota: Puedes almacenar textos de consulta largos en un archivo de disco independiente. Si el archivo es demasiado grande debido a la longitud de la consulta o a valores elevados de pg_stat_statements.max, es posible que se descarten todos los textos de la consulta. A continuación, es posible que los campos pg_stat_statements.query queden vacíos. Para obtener más información, consulta pg_stat_statements -- track statistics of SQL planning and execution (pg_stat_statements: hacer un seguimiento de las estadísticas de la planificación y la ejecución de SQL) en el sitio web de PostgreSQL.
Reducción de las entradas pg_stat_statements
Se recomienda utilizar la versión 17 de PostgreSQL para reducir las entradas pg_stat_statements. Por ejemplo, cuando usas la versión 17 y las versiones posteriores de PostgreSQL, puedes reemplazar los nombres de SAVEPOINT constantes por marcadores de posición. Por ejemplo, puedes guardar SAVEPOINT sp1 y SAVEPOINT sp2 como dos entradas pg_stat_statements diferentes en versiones anteriores de PostgreSQL. Sin embargo, en la versión 17 y las versiones posteriores de PostgreSQL, estas dos instrucciones se almacenan como una entrada; por ejemplo, como SAVEPOINT $1. Para obtener más información, consulta pg_stat_statements en el sitio web de PostgreSQL.
Si no puede actualizar a la versión 17 o posterior de PostgreSQL, comprueba si la aplicación, los asignadores relacionales de objetos (ORM) y los controladores de bases de datos emiten automáticamente comandos SQL, como SAVEPOINT. Estos comandos SAVEPOINT automáticos pueden aumentar el número de entradas pg_stat_statements.
Comprobación de la cantidad de anulaciones de asignaciones
Versión 14 y posteriores de PostgreSQL
Para comprobar el número total de veces que se ha producido una anulación de asignación, consulta la columna dealloc de la vista pg_stat_statements_info. Puedes usar esa información para ajustar el valor de pg_stat_statements.max de forma adecuada. Para obtener más información, consulta la vista pg_stat_statements_info en el sitio web de PostgreSQL.
Para comprobar la cantidad de anulaciones de asignaciones durante un tiempo determinado, selecciona periódicamente la vista pg_stat_statements_info y, a continuación, calcula la diferencia a partir de pg_stat_statements_info.dealloc.
Al seleccionar la vista pg_stat_statements_info, es posible que recibas el mensaje de error «ERROR: relation 'pg_stat_statements_info' does not exist». Este error se produce cuando pg_stat_statements solo se carga en la memoria pero no se instala en la base de datos. Para resolver este error, instala la extensión pg_stat_statements en la base de datos a la que se conecta la aplicación. Conéctate a la base de datos y, a continuación, ejecuta la siguiente instrucción SQL para instalar pg_stat_statements en la base de datos:
CREATE EXTENSION pg_stat_statements;
Para obtener más información, consulta CREATE EXTENSION en el sitio web de PostgreSQL.