Estos contenidos se han traducido de forma automática para su comodidad, pero Huawei Cloud no garantiza la exactitud de estos. Para consultar los contenidos originales, acceda a la versión en inglés.
Centro de ayuda/ Data Warehouse Service/ Prácticas recomendadas / Ajuste del rendimiento/ Uso de PGXC_STAT_ACTIVITY para analizar las sentencias SQL que se están ejecutando para gestionar problemas de rendimiento de DWS
Actualización más reciente 2026-09-29 GMT+08:00

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.

Tabla 1 Columnas de 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:

  • waiting in global queue: La sentencia está en las colas globales simultáneas.
  • waiting in respool queue: La sentencia está encolando en el grupo de recursos. Los escenarios son los siguientes:
    1. Cuando el balanceo de carga dinámico está habilitado, la cantidad de trabajos simples excede el límite superior (max_dop) de trabajos simultáneos en el carril rápido.
    2. Cuando el balanceo de carga dinámico está deshabilitado, la cantidad de trabajos simples excede el límite superior (max_dop) de trabajos simultáneos en el carril rápido o la cantidad de trabajos complejos excede el límite superior de trabajos simultáneos en el carril lento.
  • waiting in ccn queue: El trabajo está en la cola de CCN, que puede ser una cola de memoria global, una cola de memoria de carril lento o una cola simultánea.
  • Vacío o no waiting queue: La sentencia se está ejecutando.

state

text

Estado general del back-end. Su valor puede ser:

  • active: El back-end está ejecutando una consulta.
  • idle: El back-end está esperando un nuevo comando del cliente.
  • idle in transaction: El back-end está en una transacción, pero no hay ninguna sentencia que se esté ejecutando en la transacción.
  • idle in transaction (aborted): El back-end está en una transacción, pero hay sentencias que no se ejecutaron en la transacción.
  • fastpath function call: El back-end está ejecutando una función fast-path.
  • disabled: Este estado se reporta si track_activities está deshabilitado en este back-end.
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.
    1
    SELECT 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:

    1
     usename |  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.
    1
    EXECUTE 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):
    1
    SELECT 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:
    1
    SELECT 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.
    1
    SELECT 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.
    1
    SELECT 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:
    1
    SELECT 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:
    1
    EXECUTE 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.

    1
    EXECUTE 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.