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 :
Vue hg_stat_activity (pg_stat_activity) : consultez les informations relatives à l'exécution du code SQL.
Gestion des requêtes actives dans HoloWeb : affichez et gérez les requêtes actives depuis la console HoloWeb.
Dépannage des verrous : déterminez si une instruction SQL détient un verrou ou si elle est bloquée par un verrou.
Arrêt d'une requête : arrêtez les requêtes peu performantes.
Modification du délai d'expiration d'une requête active : modifiez le délai d'exécution pour éviter les interblocages.
Modification du délai d'expiration d'une requête inactive : ajustez le délai d'inactivité pour prévenir les interblocages.
Consultation des journaux de requêtes lentes : diagnostiquez et optimisez les requêtes lentes ou ayant échoué.
FAQ : causes et solutions de l'erreur
ERROR: canceling statement due to statement timeout.
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 :
-
Affichez les requêtes actives, leurs étapes d'exécution et leur consommation de ressources.
RemarqueLes 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 } -
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 -
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 -
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
UPDATEs'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.
Connectez-vous à la console HoloWeb. Consultez la rubrique Connexion à HoloWeb et exécution de requêtes.
Dans la barre de navigation supérieure, cliquez sur Diagnostics and Optimization.
Dans le volet de navigation de gauche, choisissez Management for Information About Active Queries > Active Query Tasks.
-
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.
-
-
(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.RemarquePour 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
COMMITest 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é paridle_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
10squi 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
DROPouTRUNCATEa été effectuée sur la table pendant l'exécution d'une instruction DML.L'opération
TRUNCATEéquivaut à une séquencedrop+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érationDROPouTRUNCATEconcurrente 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'erreurstatement timeout.Solution : examinez le journal des requêtes lentes pour repérer les opérations
DROPouTRUNCATEconcurrentes 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';
-