Este conteúdo foi traduzido por máquina para sua conveniência e a Huawei Cloud não pode garantir que o conteúdo foi traduzido com precisão. Para exibir o conteúdo original, use o link no canto superior direito para mudar para a página em inglês.
Central de ajuda> GaussDB(DWS)> Melhores práticas> Gerenciamento de banco de dados> Análise de instruções SQL que estão sendo executadas
Atualizado em 2024-05-09 GMT+08:00

Análise de instruções SQL que estão sendo executadas

Durante o desenvolvimento, os desenvolvedores geralmente encontram problemas como conexões SQL excessivas, tempo de consulta SQL longo e bloqueio de consulta SQL. Você pode usar as exibições PG_STAT_ACTIVITY and PGXC_THREAD_WAIT_STATUS para analisar e localizar problemas de SQL. Esta seção descreve alguns métodos comuns de localização.

Tabela 1 Alguns campos de PG_STAT_ACTIVITY

Nome

Tipo

Descrição

usename

name

Nome do usuário que efetua logon no back-end

client_addr

inet

O endereço IP do cliente conectado ao back-end null indica que o cliente está conectado por meio de um soquete Unix na máquina do servidor ou que este é um processo interno, como autovacuum.

application_name

text

Nome da aplicação conectada ao back-end

state

text

Estado geral do back-end. Os valores são:

  • active: o back-end está executando consultas.
  • idle: o back-end está aguardando novos comandos do cliente.
  • idle in transaction: o backend está em uma transação, mas não há nenhuma instrução sendo executada na transação.
  • idle in transaction (aborted): o back-end está em uma transação, mas há declarações falhadas na transação.
  • fastpath function call: o back-end está executando uma função fast-path.
  • disabled: esse estado é relatado se track_activities estiver desabilitado nesse back-end.
NOTA:

Os usuários comuns podem visualizar apenas o status da sessão de suas próprias contas. Ou seja, as informações de estado de outras contas estão vazias.

waiting

boolean

Se o back-end estiver atualmente esperando por um bloqueio, o valor será t. Caso contrário, o valor é f.

  • t significa verdadeiro.
  • f significa falso.

enqueue

text

Status de enfileiramento de uma instrução. Seu valor pode ser:

  • waiting in global queue: a instrução está enfileirando na fila concorrente global. O número de instruções simultâneas excede o valor de max_active_statements configurado para um único CN.
  • waiting in respool queue: a instrução está enfileirando no pool de recursos e a simultaneidade de trabalhos simples é limitada. A principal razão é que a simultaneidade de trabalhos simples excede o limite superior max_dop da via rápida.
  • waiting in ccn queue: o trabalho está na fila CCN, que pode ser enfileiramento de memória global, enfileiramento de memória de faixa lenta ou enfileiramento simultâneo. Os cenários são:
    1. A memória global disponível excede o limite superior, o trabalho está enfileirando na fila de memória global.
    2. As solicitações simultâneas na pista lenta no pool de recursos excedem o limite superior, que é especificado por active_statements.
    3. A memória de faixa lenta do pool de recursos excede o limite superior, ou seja, a memória estimada de trabalhos simultâneos no pool de recursos excede o limite superior especificado por mem_percent.
  • Vazio ou no waiting queue: A instrução está em execução.

pid

bigint

ID do thread de back-end.

Exibir informações de conexão

  • Defina track_activities como on.
    SET track_activities = on;

    O banco de dados coleta as informações em execução sobre consultas ativas somente se esse parâmetro está definido como on.

  • Você pode executar as seguintes instruções SQL para verificar o usuário de conexão atual, o endereço de conexão, a aplicação de conexão, o status, a espera de um bloqueio, o status do enfileiramento e o ID do thread.
    1
    SELECT usename,client_addr,application_name,state,waiting,enqueue,pid FROM PG_STAT_ACTIVITY WHERE DATNAME='database name';
    

    A seguinte saída de comando é exibida:

    1
    2
    3
    4
    5
    6
     usename |  client_addr  | application_name | state  | waiting | enqueue |       pid       
    ---------+---------------+------------------+--------+---------+---------+-----------------
     leo     | 192.168.0.133 | gsql             | idle   | f       |         | 139666091022080
     dbadmin | 192.168.0.133 | gsql             | active | f       |         | 139666212681472
     joe     | 192.168.0.133 |                  | idle   | f       |         | 139665671489280
    (3 rows)
    
  • Encerre uma sessão (somente o administrador do sistema tem a permissão).
    1
    SELECT PG_TERMINATE_BACKEND(pid);
    

Exibir informações de execução de SQL

  • Execute o seguinte comando para obter todas as informações SQL que o usuário atual tem permissão para exibir (se o usuário atual tiver permissão de administrador ou função predefinida, todas as informações de consulta do usuário poderão ser exibidas):
    1
    SELECT usename,state,query FROM PG_STAT_ACTIVITY WHERE DATNAME='database name';
    
    Se o valor de state estiver active, a coluna de consulta indicará a instrução SQL que está sendo executada. Em outros casos, a coluna de consulta indica a instrução de consulta anterior. Se o valor de state for idle, a conexão ficará ociosa e aguardará que o usuário insira um comando. A seguinte saída de comando é exibida:
    1
    2
    3
    4
    5
    6
     usename | state  |                                   query                                   
    ---------+--------+---------------------------------------------------------------------------
     leo     | idle   | select * from joe.mytable;
     dbadmin | active | SELECT usename,state,query FROM PG_STAT_ACTIVITY WHERE DATNAME='gaussdb';
     joe     | idle   | GRANT SELECT ON TABLE mytable to leo;
    (3 rows)
    
  • Execute o seguinte comando para exibir as informações sobre as instruções SQL que não estão no estado ocioso:
    1
    SELECT datname,usename,query FROM PG_STAT_ACTIVITY WHERE state != 'idle' ;
    

Exibir instruções que consomem muito tempo

  • Verifique as instruções SQL que levam muito tempo para serem executadas.
    1
    SELECT current_timestamp - query_start as runtime, datname, usename, query FROM PG_STAT_ACTIVITY WHERE state != 'idle' order by 1 desc;
    

    As instruções de consulta são retornadas e classificadas por duração de tempo de execução em ordem decrescente. O primeiro registro é a instrução de consulta que leva mais tempo para ser executada.

    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 PG_STAT_ACTIVITY WHERE state != 'idle' order by 1 desc;
    (2 rows)
    
  • Como alternativa, você pode definir current_timestamp - query_start para ser maior que um limite para identificar instruções de consulta que são executadas por um período maior que esse limite.
    1
    SELECT query from PG_STAT_ACTIVITY WHERE current_timestamp - query_start > interval '2 days';
    

Consultar instruções bloqueadas

  • Execute o seguinte comando para exibir instruções de consulta bloqueadas:
    1
    SELECT pid, datname, usename, state, query FROM PG_STAT_ACTIVITY WHERE state <> 'idle' and waiting=true;
    
    Execute a instrução a seguir para encerrar a sessão SQL bloqueada:
    1
    SELECT PG_TERMINATE_BACKEND(pid);
    
    • Na maioria dos casos, o bloqueio é causado por bloqueios internos e waiting=true é exibido. Você pode ver o bloqueio na exibição pg_stat_activity.
    • As instruções bloqueadas sobre a gravação de arquivos e agendadores de eventos não podem ser visualizadas na exibição pg_stat_activity.
  • Exiba informações sobre as instruções de consulta bloqueadas, tabelas e esquemas.
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    SELECT w.query as waiting_query,
    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 pg_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 pg_stat_activity l on l2.pid = l.pid join pg_stat_user_tables t on l1.relation = t.relid
    where w.waiting;
    

    A saída do comando inclui um ID de sessão, informações do usuário, status da consulta e tabela ou esquema que causou o bloqueio.

    Depois de encontrar a tabela bloqueada ou informações de esquema, encerre a sessão defeituosa.

    1
    SELECT PG_TERMINATE_BACKEND(pid);
    

    Se informações semelhantes às seguintes forem exibidas, a sessão será encerrada com êxito:

    PG_TERMINATE_BACKEND 
    ----------------------  
    t 
    (1 row)

    Se informações semelhantes às seguintes forem exibidas, o usuário está tentando encerrar a sessão, mas a sessão será reconectada em vez de encerrada.

    FATAL:  terminating connection due to administrator command 
    FATAL:  terminating connection due to administrator command 
    The connection to the server was lost. Attempting reset: Succeeded.

    Se a função PG_TERMINATE_BACKEND for usada pelo cliente de gsql para encerrar os threads em segundo plano da sessão, o cliente será reconectado automaticamente em vez de ser encerrado.