Tous les produits
Search
Centre de documentation

Hologres:Manage queries

Dernière mise à jour :Aug 11, 2026

Diagnostiquez et gérez les requêtes en cours d'exécution sur une instance Hologres.

Vue d'ensemble

Hologres est compatible avec PostgreSQL. Utilisez la vue hg_stat_activity (pg_stat_activity) pour surveiller le temps d'exécution des requêtes au sein d'une instance. Cette rubrique couvre les opérations suivantes :

Remarque

Hologres ne prend pas en charge les limites de mémoire ou de CPU par requête. Pour contrôler les ressources allouées aux requêtes, utilisez une file d'attente de requêtes afin de gérer et planifier les ressources de charge de travail.

Affichage des requêtes actives via SQL

Exécutez les instructions SQL suivantes pour afficher les requêtes actives :

  1. Affichez les requêtes actives, leurs étapes d'exécution et leur consommation de ressources.

    Remarque

    Les superutilisateurs peuvent consulter les informations d'exécution de tous les utilisateurs. Les autres utilisateurs n'ont accès qu'à leurs propres données.

    -- For Hologres V2.0 and later
    SELECT query,state,query_id,transaction_id,running_info, extend_info 
    FROM hg_stat_activity 
    WHERE state = 'active' 
    AND     backend_type = 'client backend'
    AND     application_name != 'hologres'
    
    -- For Hologres V1.3 and earlier
    SELECT query,state,pid
    FROM pg_stat_activity 
    WHERE state = 'active' 
    AND     backend_type = 'client backend'
    AND     application_name != 'hologres'

    Exemple de résultat :

    -------------------------------------------------------------------------------
    query          | insert into test_hg_stat_activity select i, (i % 7) :: text, (i % 1007) from generate_series(1, 10000000)i;
    state          | active
    query_id       | 100713xxxx
    transaction_id | 100713xxxx
    running_info   | {"current_stage" : {"stage_duration_ms" :5994,
                                          "stage_name" :"EXECUTE" },
                       "engine_type" :"{HQE,PQE}",
                       "fe_id" :1,
                       "warehouse_id" :0 }
    extend_info    | {"affected_rows" :9510912,
                      "scanned_rows" :9527296 }
  2. Triez les requêtes en cours d'exécution selon leur consommation de CPU.

    -- For Hologres V2.0 and later
    SELECT query,((extend_info::json)->'total_cpu_max_time_ms')::text::bigint AS cpu_cost,state,query_id,transaction_id 
    FROM hg_stat_activity WHERE state = 'active' ORDER BY 2 DESC;

    Exemple de résultat :

    ---------------------------------------------------------------------------------
    query          | select xxxxx
    cpu_cost       | 523461
    state          | active
    query_id       | 10053xxxx
    transaction_id | 10053xxxx
    ---------------------------------------------------------------------------------
    query          | insert xxxx
    cpu_cost       | 4817
    state          | active
    query_id       | 1008305xxx
    transaction_id | 1008305xxx
  3. Triez les requêtes en cours d'exécution selon leur consommation de mémoire.

    -- For Hologres V2.0 and later
    SELECT query,((extend_info::json)->'total_mem_max_bytes')::text::bigint AS mem_max_cost,state,query_id,transaction_id 
    FROM hg_stat_activity WHERE state = 'active' ORDER BY 2 DESC;

    Exemple de résultat :

    ---------------------------------------------------------------------------------
    query          | update xxxx;
    mem_max_cost   | 5727634542
    state          | active
    query_id       | 10053302784827629
    transaction_id | 10053302784827629
    ---------------------------------------------------------------------------------
    query          | select xxxx;
    mem_max_cost   | 19535640
    state          | active
    query_id       | 10083259096119559
    transaction_id | 10083259096119559
  4. Identifiez les requêtes longues sur l'instance actuelle.

    -- For Hologres V2.0 and later
    SELECT current_timestamp - query_start AS runtime, datname::text, usename, query, query_id
        FROM hg_stat_activity
        WHERE state != 'idle'
        AND backend_type = 'client backend'
        AND application_name != 'hologres'
        ORDER BY 1 DESC;
    
    -- For Hologres V1.3 and earlier
    SELECT current_timestamp - query_start AS runtime, datname::text, usename, query, pid
        FROM pg_stat_activity
        WHERE state != 'idle'
        AND backend_type = 'client backend'
        AND application_name != 'hologres'
        ORDER BY 1 DESC;

    Exemple de résultat :

    runtime          |  datname  | usename  | query_id    |      current_query
    -----------------+----------------+----------+------------------------------------
     00:00:24.258388 | holotest  | 123xxx   | 1267xx | UPDATE xxx;
     00:00:1.186394  | testdb    | 156xx    | 1783xx | select xxxx;

    L'instruction UPDATE s'exécute depuis 24 secondes sans se terminer.

Gestion des requêtes actives dans HoloWeb

Visualisez et gérez les requêtes actives depuis la console HoloWeb.

  1. Connectez-vous à la console HoloWeb. Consultez la rubrique Connexion à HoloWeb et exécution de requêtes.

  2. Dans la barre de navigation supérieure, cliquez sur Diagnostics and Optimization.

  3. Dans le volet de navigation de gauche, choisissez Management for Information About Active Queries > Active Query Tasks.

  4. Sur la page Active Query Tasks, cliquez sur Search pour afficher et gérer les requêtes actives de l'instance courante.

    Les résultats incluent les champs suivants :

    Parameter

    Description

    Query start

    When the query started.

    Runtime

    Execution duration.

    PID

    Process ID of the backend handling the query.

    Query

    SQL statement being executed.

    State

    Connection state. Common values:

    • active: Query is running.

    • idle: Connection is idle.

    • idle in transaction: Idle within a transaction.

    • idle in transaction (Aborted): Idle within a failed transaction.

    • \N: Null state, typically a system background process. Can be ignored.

    User name

    Username of the current connection.

    Application

    Application that initiated the query.

    Client address

    Client IP address.

    Pour arrêter une requête longue, cliquez sur Cancel dans la colonne Actions. Vous pouvez également sélectionner plusieurs requêtes et cliquer sur Batch Cancel.

  5. (Facultatif) Cliquez sur Details dans la colonne Actions pour afficher les détails de la requête.

    Sur la page Details, vous pouvez :

    • Copy : copiez l'instruction SQL.

    • Format : formatez l'instruction SQL.

Dépannage des verrous

Examinez les requêtes actives pour déterminer si une instruction SQL détient un verrou ou si elle est bloquée par un verrou. Consultez la rubrique Verrous et dépannage des verrous.

Arrêt d'une requête

Arrêtez les requêtes peu performantes à l'aide des commandes suivantes.

  • Arrêtez une seule requête :

    SELECT pg_cancel_backend(<pid>);
  • Arrêtez plusieurs requêtes par lot :

    SELECT pg_cancel_backend(pid)
            ,query
            ,datname
            ,usename
            ,application_name
            ,client_addr
            ,client_port
            ,backend_start
            ,state
    FROM    pg_stat_activity
    WHERE   length(query) > 0
    AND     pid != pg_backend_pid()
    AND     backend_type = 'client backend'
    AND     application_name != 'hologres'

Modification du délai d'expiration des requêtes actives

Modifiez le délai d'exécution des requêtes actives.

  • Syntaxe

    SET statement_timeout = <time>;
  • Description des paramètres

    time : valeur du délai d'expiration. Plage : 0 à 2147483647. Unité par défaut : millisecondes. Pour utiliser une autre unité, entourez la valeur et l'unité de guillemets simples. Valeur par défaut : 10 heures. Ce paramètre s'applique uniquement à la session en cours.

    Remarque

    Pour que le délai d'expiration soit pris en compte, l'instruction SET statement_timeout = <time> doit être exécutée dans le même lot que l'instruction SQL cible.

  • Exemples d'utilisation

    • Définissez le délai d'expiration sur 5 000 minutes. Puisqu'une unité est spécifiée, placez la valeur entre guillemets simples.

      SET statement_timeout = '5000min' ; 
      SELECT * FROM tablename;
    • Définissez le délai d'expiration sur 5 000 ms.

      SET statement_timeout = 5000 ; 
      SELECT * FROM tablename;

Modification du délai d'expiration des requêtes inactives

Le paramètre idle_in_transaction_session_timeout contrôle la durée après laquelle les transactions inactives sont arrêtées. Sans ce paramétrage, les transactions inactives n'expirent jamais, ce qui peut provoquer des interblocages.

  • Cas d'utilisation

    Configurez ce délai d'expiration pour éviter les interblocages causés par des transactions orphelines. Par exemple, la transaction suivante n'est jamais validée car l'instruction COMMIT est absente, entraînant une fuite de transaction susceptible de générer un interblocage au niveau de la base de données.

    BEGIN; 
    SELECT * FROM t;

    Pour résoudre ce problème, définissez le paramètre idle_in_transaction_session_timeout. Si une transaction ouverte n'est ni validée ni annulée dans le délai spécifié par idle_in_transaction_session_timeout, le système annule automatiquement la transaction et ferme la connexion.

  • Syntaxe

    -- Modify the idle transaction timeout at the session level.
    SET idle_in_transaction_session_timeout=<time>;
    
    -- Modify the idle transaction timeout at the database level.
    ALTER database db_name SET idle_in_transaction_session_timeout=<time>;
  • Description des paramètres

    time : valeur du délai d'expiration. Plage : 0 à 2147483647. Unité par défaut : millisecondes. Pour utiliser une autre unité, entourez la valeur et l'unité de guillemets simples. Valeur par défaut : 0 (aucune interruption automatique) sur Hologres V0.10 et versions antérieures ; 10 minutes sur Hologres V1.1 et versions ultérieures. Les transactions restant inactives plus de 10 minutes sont annulées.

    Remarque

    Évitez de définir un délai d'expiration trop court. Le système risque d'annuler des transactions encore en cours d'utilisation.

  • Exemples d'utilisation

    Définissez le délai d'expiration sur 300 000 ms.

    -- Modify the idle transaction timeout at the session level.
    SET idle_in_transaction_session_timeout=300000;
    
    -- Modify the idle transaction timeout at the database level.
    ALTER database db_name SET idle_in_transaction_session_timeout=300000;

Consultation des journaux de requêtes lentes

Hologres V0.10 et versions ultérieures prennent en charge les journaux de requêtes lentes. Consultez la rubrique Affichage et analyse des journaux de requêtes lentes.

FAQ

  • Symptôme

    L'exécution d'une instruction SQL renvoie l'erreur suivante : ERROR: canceling statement due to statement timeout.

  • Causes et solutions

    • Cause 1 : Un délai d'expiration est configuré côté client ou sur l'instance Hologres. Paramètres de délai d'expiration courants :

      • Les API Data Service disposent d'un délai d'expiration fixe de 10s qui ne peut pas être modifié. Optimisez vos instructions SQL pour réduire leur temps d'exécution.

      • Le module SQL Hologres dans HoloWeb ou DataWorks impose un délai d'expiration fixe des requêtes de 1h. Optimisez votre code SQL pour accélérer l'exécution.

      • Un délai d'expiration est défini au niveau de l'instance. Exécutez l'instruction SQL suivante pour le vérifier. Si le délai de l'instance provoque l'erreur, ajustez-le selon vos besoins.

        SHOW statement_timeout;
      • Un délai d'expiration est configuré sur le client ou l'application. Vérifiez et ajustez les paramètres de délai d'expiration du client si nécessaire.

    • Cause 2 : Une opération DROP ou TRUNCATE a été effectuée sur la table pendant l'exécution d'une instruction DML.

      L'opération TRUNCATE équivaut à une séquence drop+create. Une instruction DML en cours d'exécution détient un verrou de ligne ou de table (consultez la rubrique Verrous et dépannage des verrous). Une opération DROP ou TRUNCATE concurrente sur la même table entre en conflit pour l'obtention de ce verrou, ce qui amène le système à annuler l'instruction DML avec l'erreur statement timeout.

      Solution : examinez le journal des requêtes lentes pour repérer les opérations DROP ou TRUNCATE concurrentes sur la table concernée et évitez-les.

      -- Example: Query the logs for drop/truncate operations on a specific table over the past day.
      SELECT * FROM hologres.hg_query_log 
      WHERE command_tag IN ('DROP TABLE','TRUNCATE TABLE') 
      AND query LIKE '%xxx%' AND query_start >= now() - interval '1 day';