Uso de PGXC_STAT_ACTIVITY para analizar las sentencias SQL que se están ejecutando para gestionar problemas de rendimiento de DWS
Durante el desarrollo, los desarrolladores suelen encontrarse con problemas como conexiones SQL excesivas, tiempo de consulta SQL prolongado y bloqueo de consultas SQL. Puede utilizar las vistas PGXC_STAT_ACTIVITY y PGXC_THREAD_WAIT_STATUS para analizar y localizar problemas de SQL. Esta sección describe algunos métodos comunes de localización que utilizan PGXC_STAT_ACTIVITY.
| Columna | Tipo | Descripción |
|---|---|---|
| coorname | text | Nombre del CN en el clúster actual |
| datid | oid | OID de la base de datos a la que se conecta la sesión de usuario en el back-end |
| datname | name | Nombre de la base de datos a la que se conecta la sesión de usuario en el back-end |
| pid | bigint | ID del subproceso de back-end |
| lwtid | integer | ID del subproceso ligero del subproceso de back-end |
| usesysid | oid | OID del usuario que inicia sesión en el back-end |
| usename | name | Nombre del usuario que inicia sesión en el back-end |
| application_name | text | Nombre de la aplicación conectada al back-end |
| client_addr | inet | Dirección IP del cliente conectado al back-end. null indica que el cliente está conectado a través de un socket Unix en la máquina del servidor o que se trata de un proceso interno, como el autovacuum. |
| client_hostname | text | Nombre de host del cliente conectado, según lo reportado por una búsqueda de DNS inverso de client_addr. Esta columna solo será no nula para conexiones IP, y solo cuando log_hostname esté habilitado. |
| client_port | integer | Número de puerto TCP utilizado por el cliente para comunicarse con el back-end. Si se utiliza un socket Unix, es –1. |
| backend_start | timestamp with time zone | Hora de inicio del proceso de back-end, es decir, la hora en que el cliente se conecta al servidor |
| xact_start | timestamp with time zone | Hora en que se inició la transacción actual, o NULL si no hay ninguna transacción activa. Si la consulta actual es la primera de su transacción, esta columna es igual a la columna query_start. |
| query_start | timestamp with time zone | Hora en que se inició la consulta actualmente activa, u hora en que se inició la última consulta si state no es active |
| state_change | timestamp with time zone | Hora del último cambio de estado |
| waiting | boolean | El valor es t si el back-end está esperando un bloqueo o nodo. De lo contrario, el valor es f. |
| enqueue | text | Estado de encolamiento de una sentencia. Su valor puede ser:
|
| state | text | Estado general del back-end. Su valor puede ser:
NOTA: Solo los administradores del sistema pueden ver el estado de la sesión de sus cuentas. La información de estado de otras cuentas está vacía. |
| resource_pool | name | Grupo de recursos utilizado por el usuario |
| stmt_type | text | Tipo de una sentencia de usuario |
| query_id | bigint | ID de una consulta |
| query | text | Texto de la consulta más reciente de este back-end. Si state es active, esta columna muestra la consulta en curso. En todos los demás estados, muestra la última consulta que se ejecutó. |
| connection_info | text | Cadena en formato JSON que registra el tipo de controlador, la versión del controlador, la ruta de despliegue del controlador y el propietario del proceso de la base de datos conectada |
Consulta de información de conexión
- Establezca track_activities en on.
SET track_activities = on;
La base de datos recopila la información de ejecución sobre consultas activas solo si este parámetro se establece en on.
- Puede ejecutar las siguientes sentencias SQL para verificar el usuario de conexión actual, la dirección de conexión, la aplicación de conexión, el estado, si hay que esperar un bloqueo, el estado de la cola y el ID del subproceso.
1SELECT coorname, usename,client_addr,application_name,state,waiting,enqueue,pid FROM PGXC_STAT_ACTIVITY WHERE DATNAME='Database name';
Se muestra el siguiente resultado del comando:

1usename | client_addr | application_name | state | waiting | enqueue | pid
- Finalizar una sesión (solo el administrador del sistema tiene el permiso). cn_name es el valor de coorname en el resultado del comando anterior, y pid es el PID correspondiente.
1EXECUTE DIRECT ON(cn_name) 'SELECT pg_terminate_backend(pid)';
Consulta de información de ejecución de SQL
- Ejecute el siguiente comando para obtener toda la información SQL que el usuario actual tiene permiso para ver (si el usuario actual tiene permiso de administrador o de rol preestablecido, se puede mostrar toda la información de consultas del usuario):
1SELECT usename,state,query FROM PGXC_STAT_ACTIVITY WHERE DATNAME='Database name';
Si el valor de state es active, la columna query indica la sentencia SQL que se está ejecutando. En otros casos, la columna query indica la sentencia de consulta anterior. Si el valor de state es idle, la conexión está inactiva y espera a que el usuario ingrese un comando. Se muestra el siguiente resultado del comando:1 2 3 4 5 6
usename | state | query ---------+--------+--------------------------------------------------------------------------- leo | idle | select * from joe.mytable; dbadmin | active | SELECT usename,state,query FROM PGXC_STAT_ACTIVITY WHERE DATNAME='gaussdb'; joe | idle | GRANT SELECT ON TABLE mytable to leo; (3 rows)
- Ejecute el siguiente comando para ver la información sobre las sentencias SQL que no están en estado inactivo:
1SELECT datname,usename,query FROM PGXC_STAT_ACTIVITY WHERE state != 'idle' ;
Consulta de sentencias que consumen mucho tiempo
- Verifique las sentencias SQL que tardan mucho tiempo en ejecutarse.
1SELECT current_timestamp - query_start as runtime, datname, usename, query FROM PGXC_STAT_ACTIVITY WHERE state != 'idle' order by 1 desc;
Las sentencias de consulta se devuelven y se ordenan por duración de tiempo de ejecución en orden descendente. El primer registro es la sentencia de consulta que tarda más tiempo en ejecutarse.
1 2 3 4 5
runtime | datname | usename | query -----------------+----------+---------+----------------------------------------------------------------------------------------------------------------------------------------- 00:04:47.054958 | gaussdb | leo | insert into mytable1 select generate_series(1, 10000000); 00:00:01.72789 | gaussdb | dbadmin | SELECT current_timestamp - query_start as runtime, datname, usename, query FROM PGXC_STAT_ACTIVITY WHERE state != 'idle' order by 1 desc; (2 rows)
- Alternativamente, puede establecer current_timestamp - query_start para que sea mayor que un umbral para identificar las sentencias de consulta que se ejecutan durante un período de tiempo superior a este umbral.
1SELECT query from PGXC_STAT_ACTIVITY WHERE current_timestamp - query_start > interval '2 days';
Consulta de sentencias bloqueadas
- Ejecute el siguiente comando para ver las sentencias de consulta bloqueadas:
1SELECT coorname, pid, datname, usename, state, query FROM PGXC_STAT_ACTIVITY WHERE state <> 'idle' and waiting=true;
Ejecute la siguiente sentencia para finalizar la sesión SQL bloqueada:1EXECUTE DIRECT ON(cn_name) 'SELECT pg_terminate_backend(pid)';
- En la mayoría de los casos, el bloqueo es causado por bloqueos internos y se muestra waiting=true. Puede ver el bloqueo en la vista pgxc_stat_activity.
- Las sentencias bloqueadas relacionadas con la escritura de archivos y los programadores de eventos no se pueden visualizar en la vista pgxc_stat_activity.
- Consulte la información sobre las sentencias de consulta, las tablas y los esquemas bloqueados:
1 2 3 4 5 6 7 8 9 10 11 12
SELECT w.query as waiting_query, w.coorname as w_cn, w.pid as w_pid, w.usename as w_user, l.query as locking_query, l.pid as l_pid, l.usename as l_user, t.schemaname || '.' || t.relname as tablename from pgxc_stat_activity w join pg_locks l1 on w.pid = l1.pid and not l1.granted join pg_locks l2 on l1.relation = l2.relation and l2.granted join pgxc_stat_activity l on l2.pid = l.pid join pg_stat_user_tables t on l1.relation = t.relid where w.waiting;
Se devuelve el ID de la sesión, el nombre de CN, la información del usuario, el estado de la consulta, así como la información sobre las tablas y los esquemas que bloquean las sentencias de consulta.
Después de encontrar la información de la tabla o del esquema bloqueado, finalice la sesión defectuosa en función del ID de la sesión.
1EXECUTE DIRECT ON(cn_name) 'SELECT pg_terminate_backend(pid)';
Si se devuelve t o true, la sesión finaliza.
Si se devuelve información similar a la siguiente, el usuario está intentando finalizar la sesión, pero la sesión se volverá a conectar en lugar de finalizar.
FATAL: terminating connection due to administrator command FATAL: terminating connection due to administrator command The connection to the server was lost. Attempting reset: Succeeded.
Si el cliente gsql utiliza la función PG_TERMINATE_BACKEND para finalizar los subprocesos en segundo plano de la sesión, el cliente se volverá a conectar automáticamente en lugar de finalizar.