Les tables dynamiques exécutent des tâches d'actualisation en arrière-plan selon l'heure de début et l'intervalle configurés. Lorsque la table de base change, la table dynamique s'actualise pour refléter les dernières données. Cette rubrique explique comment surveiller, consulter et gérer ces tâches d'actualisation.
Métriques de surveillance
À partir de Hologres V4.0.8, quatre métriques sont disponibles pour les tâches d'actualisation des tables dynamiques. Configurez les seuils d'alerte dans Cloud Monitor selon vos besoins. Pour plus d'informations, consultez CloudMonitor.
QPS d'échec d'actualisation au niveau de l'instance
Nom de la métrique : Dynamic Table Refresh Failed QPS Unité : count/s (requêtes par seconde)
Cette métrique indique le taux d'échec des tâches d'actualisation pour toutes les tables dynamiques d'une instance. En conditions normales, la valeur reste proche de zéro.
Si cette valeur est constamment non nulle ou en hausse, accédez à HoloWeb pour résoudre les problèmes.
Latence des données
Nom de la métrique : Dynamic Table Lag Unité : s (secondes)
Cette métrique montre le retard de chaque table dynamique par rapport à sa table de base ou à un point dans le temps spécifié. Elle reflète la fraîcheur des données.
Si la latence augmente continuellement :
|
Cause possible |
Étape suivante |
|
Les tâches d'actualisation échouent de manière répétée ou l'actualisation automatique est suspendue |
Accédez à HoloWeb console et vérifiez l'état des tâches |
|
Un volume important de données en amont a changé et les ressources de l'instance sont insuffisantes pour suivre |
Examinez les métriques de surveillance Hologres, telles que la durée d'actualisation, afin d'identifier les goulots d'étranglement liés aux ressources |
Durée des tâches d'actualisation
Nom de la métrique : Dynamic Table Refresh Duration Unité : ms (millisecondes)
Cette métrique indique la durée d'exécution de la tâche d'actualisation actuelle pour chaque table dynamique. Utilisez-la pour détecter si la durée d'actualisation s'allonge.
Si la valeur augmente soudainement ou reste significativement supérieure à sa moyenne historique :
|
Cause possible |
Étape suivante |
|
Goulot d'étranglement des ressources |
Vérifiez les métriques CPU, mémoire et stockage de l'instance |
|
Augmentation du volume de données en amont |
Interrogez |
QPM d'échec d'actualisation par table
Nom de la métrique : Dynamic Table Refresh Failed QPM Unité : count/m (nombre par minute)
Cette métrique indique le nombre de tâches d'actualisation ayant échoué par minute pour chaque table dynamique. En conditions normales, la valeur est nulle.
Interprétation de cette métrique :
|
Modèle observé |
Signification |
Action |
|
Pics occasionnels, les actualisations suivantes réussissent |
Pression système transitoire ou mise à niveau de l'instance |
Aucune action requise |
|
La valeur reste supérieure à zéro de manière persistante pour une table spécifique |
Échec d'actualisation persistant |
Interrogez |
Afficher les tâches d'actualisation
Afficher les tâches d'actualisation en cours
Utilisation de hologres.hg_dynamic_table_refresh_activity
La table système hologres.hg_dynamic_table_refresh_activity affiche les tâches d'actualisation en cours, y compris les actualisations complètes et incrémentielles, ainsi que leur consommation de ressources. Pour la description des champs, consultez hologres.hg_dynamic_table_refresh_activity.
Cette table système est prise en charge uniquement dans Hologres V3,0, et V4.0.8 et versions ultérieures.
-- View currently running refresh tasks
SELECT
pid,
query_id,
refresh_mode,
'RUNNING' AS status,
refresh_start,
extract(epoch FROM duration) AS duration, -- milliseconds
serverless_queue_time_ms::bigint / 1000 AS serverless_queue_time_sec,
serverless_resource_used_time_ms::bigint / 1000 AS serverless_resource_used_time_sec,
serverless_allocated_cores
FROM hologres.hg_dynamic_table_refresh_activity
WHERE datname = '${database}'
AND table_write = quote_ident('${schema}') || '.' || quote_ident('${tableName}')
ORDER BY refresh_start DESC
LIMIT 2000;
Utilisation de hg_stat_activity
La vue système hg_stat_activity affiche également les tâches d'actualisation en cours. L'affichage varie selon le mode d'actualisation :
Actualisation complète : Une instruction
INSERTapparaît.Actualisation incrémentielle : Une tâche
Refreshapparaît.
Utilisation de hologres.hg_dynamic_table_refresh_log
Pour les tables dynamiques créées avec la syntaxe 3,1, hologres.hg_dynamic_table_refresh_log offre une vue par table des journaux de tâches d'actualisation. L'exemple suivant interroge toutes les tâches d'actualisation actuellement en cours pour une table spécifique :
-- View running refresh tasks for a specific table (3.1 syntax)
SELECT query_job_id, status
FROM hologres.hg_dynamic_table_refresh_log('<dynamic_table_name>')
WHERE status = 'RUNNING';
hologres.hg_dynamic_table_refresh_log est pris en charge uniquement pour les tables dynamiques créées avec la syntaxe 3,1. Pour les tables dynamiques créées avec la syntaxe 3,0, utilisez hologres.hg_dynamic_table_refresh_activity ou hg_stat_activity.
L'ID query_job_id renvoyé par cette vue est également utilisé lors de l'annulation d'une tâche d'actualisation en cours. Pour plus d'informations, consultez Tables dynamiques créées avec la nouvelle syntaxe 3,1.
Utilisation des métriques de surveillance
Vérifiez des métriques telles que le QPS, le RPS (enregistrements par seconde) et la latence pour confirmer l'état d'exécution. Un Command Type défini sur refresh indique une tâche d'actualisation de table dynamique. Pour plus d'informations, consultez Métriques de surveillance.
Si la tâche d'actualisation s'exécute sur des ressources Serverless Computing, vous pouvez également vérifier son état dans les métriques Serverless Computing.
Afficher les tâches d'actualisation historiques
Utilisation de hologres.hg_dynamic_table_refresh_history
La table système hologres.hg_dynamic_table_refresh_history enregistre l'historique de toutes les tâches d'actualisation (complètes, incrémentielles et manuelles) pour le mois écoulé. Pour la description des champs, consultez hologres.hg_dynamic_table_refresh_history.
Les enregistrements sont conservés pendant un mois. Les données de plus d'un mois ne peuvent pas être interrogées.
Les propriétaires de table peuvent afficher uniquement leur propre historique d'actualisation. Les utilisateurs disposant du rôle superuser peuvent afficher tous les enregistrements d'actualisation.
Exemple 1 : Afficher les tâches d'actualisation incrémentielles du jour précédent
SELECT
query_id,
refresh_mode,
status,
refresh_start,
duration,
refresh_latency / 1000 AS refresh_latency_second,
serverless_allocated_cores,
queue_time_ms::bigint / 1000 AS queue_time_second,
serverless_resource_used_time_ms::bigint / 1000 AS serverless_resource_used_time_second
FROM hologres.hg_dynamic_table_refresh_history
WHERE refresh_start >= CURRENT_DATE - INTERVAL '1 day'
AND dynamic_table_name = '<dynamic_table>'
AND refresh_mode = 'incremental'
ORDER BY refresh_start DESC
LIMIT 100;
Exemple 2 : Afficher toutes les tâches d'actualisation de l'instance du jour précédent
SELECT
query_id,
refresh_mode,
status,
refresh_start,
duration,
refresh_latency / 1000 AS refresh_latency_second,
serverless_allocated_cores,
queue_time_ms::bigint / 1000 AS queue_time_second,
serverless_resource_used_time_ms::bigint / 1000 AS serverless_resource_used_time_second
FROM hologres.hg_dynamic_table_refresh_history
WHERE refresh_start >= CURRENT_DATE - INTERVAL '1 day';
Exemple 3 : Afficher les tâches d'actualisation d'une table spécifique du jour précédent
SELECT
query_id,
refresh_mode,
status,
refresh_start,
duration,
refresh_latency / 1000 AS refresh_latency_second,
serverless_allocated_cores,
queue_time_ms::bigint / 1000 AS queue_time_second,
serverless_resource_used_time_ms::bigint / 1000 AS serverless_resource_used_time_second
FROM hologres.hg_dynamic_table_refresh_history
WHERE schema_name = '<schema_name>'
AND dynamic_table_name = '<dynamic_table>'
AND refresh_start >= CURRENT_DATE - INTERVAL '1 day';
Pour les tables dynamiques à actualisation complète créées avec l'ancienne syntaxe 3,0,hologres.hg_dynamic_table_refresh_historypeut ne pas refléter avec précision l'état de réussite ou d'échec — une actualisation ayant échoué peut apparaître commeSuccess. Pour récupérer le véritable historique d'actualisation de ces tables : 1. Obtenez lecron_job_namedepuishologres.hg_dynamic_table_properties. 2. Interrogez les enregistrements d'exécution des tâches cron en utilisant ce nom.
-- Step 1: Get the cron_job_name
SELECT property_value AS cron_job_name
FROM hologres.hg_dynamic_table_properties
WHERE dynamic_table_name = '<dt_name>'
AND property_key = 'cron_job_name';
-- Step 2: Query cron job execution records
SELECT *
FROM hologres.hg_user_cron_tasks
WHERE jobname = '<cron_job_name>'
ORDER BY start_time DESC;
Utilisation des journaux de requêtes lentes
Les tâches d'actualisation apparaissent également dans les journaux de requêtes lentes avec Command Type défini sur refresh. Pour plus d'informations, consultez Obtenir et analyser les journaux de requêtes lentes.
Afficher le plan d'exécution d'une tâche d'actualisation
Utilisez EXPLAIN et EXPLAIN ANALYZE sur une instruction d'actualisation pour afficher son plan d'exécution et identifier les goulots d'étranglement de performances, comme vous le feriez pour une requête classique.
EXPLAIN REFRESH DYNAMIC TABLE hmtest.dt_order_lineitem;
Exemple de sortie :
QUERY PLAN
-------------------------------------------------------------------------------------------------------------
Gather (cost=0.00..10.13 rows=1 width=16)
-> Insert (cost=0.00..10.13 rows=1 width=16)
-> Redistribution (cost=0.00..10.11 rows=1 width=16)
-> Final HashAggregate (cost=0.00..10.11 rows=1 width=16)
Group Key: orders.o_orderpriority
-> Redistribution (cost=0.00..10.11 rows=10 width=16)
Hash Key: orders.o_orderpriority
-> Partial HashAggregate (cost=0.00..10.11 rows=10 width=16)
Group Key: orders.o_orderpriority
-> Hash Left Semi Join (cost=0.00..10.11 rows=1000 width=8)
Hash Cond: (orders.o_orderkey = lineitem.l_orderkey)
-> Redistribution (cost=0.00..5.03 rows=1000 width=16)
Hash Key: orders.o_orderkey
-> Local Gather (cost=0.00..5.01 rows=1000 width=16)
-> Seq Scan on orders (cost=0.00..5.01 rows=1000 width=16)
Filter: ((o_orderdate >= '1996-07-01 00:00:00+08'::timestamp with time zone) AND (o_orderdate < '1996-10-01 00:00:00+08'::timestamp with time zone))
-> Hash (cost=5.03..5.03 rows=1000 width=8)
-> Redistribution (cost=0.00..5.03 rows=1000 width=8)
Hash Key: lineitem.l_orderkey
-> Local Gather (cost=0.00..5.03 rows=1000 width=8)
-> Seq Scan on lineitem (cost=0.00..5.03 rows=1000 width=8)
Filter: (l_commitdate < l_receiptdate)
Optimizer: HQO version 2.1.0
(23 rows)
Définir la durée d'expiration de l'actualisation
Définissez un délai d'expiration pour empêcher les tâches d'actualisation de longue durée de bloquer les ressources. Hologres prend en charge trois niveaux de configuration du délai d'expiration.
Délai d'expiration au niveau de la table
Définissez un délai d'expiration au niveau de la table lors de la création de la table dynamique. Il s'applique à toutes les tâches d'actualisation de cette table. L'exemple suivant utilise le jeu de données public tpch_10g . Avant d'exécuter le code, importez le jeu de données. Pour plus d'informations, consultez Créer une tâche d'importation de jeu de données public.
-- Set a 30-minute timeout for all refresh tasks on this table
CREATE DYNAMIC TABLE tpch_q1_batch
WITH (
refresh_mode = 'full',
auto_refresh_enable = 'true',
full_auto_refresh_interval = '1 hours',
refresh_guc_statement_timeout = '30 min'
)
AS
SELECT
l_returnflag,
l_linestatus,
SUM(l_quantity) AS sum_qty,
SUM(l_extendedprice) AS sum_base_price,
SUM(l_extendedprice * (1 - l_discount)) AS sum_disc_price,
SUM(l_extendedprice * (1 - l_discount) * (1 + l_tax)) AS sum_charge,
AVG(l_quantity) AS avg_qty,
AVG(l_extendedprice) AS avg_price,
AVG(l_discount) AS avg_disc,
COUNT(*) AS count_order
FROM hologres_dataset_tpch_10.lineitem
WHERE l_shipdate <= DATE '1998-12-01' - INTERVAL '120' DAY
GROUP BY l_returnflag, l_linestatus;
Délai d'expiration au niveau de la session
Pour une actualisation manuelle, définissez le délai d'expiration à l'aide d'un paramètre GUC (Grand Unified Configuration) au niveau de la session :
SET statement_timeout = <time>;
REFRESH DYNAMIC TABLE <dynamic_schema_name.dynamic_table_name>;
Pour plus d'informations sur les paramètres de délai d'expiration, consultez Modifier le délai d'expiration des requêtes actives.
Délai d'expiration par actualisation
Remplacez le délai d'expiration pour une seule actualisation manuelle en utilisant refresh ... WITH (refresh_guc_statement_timeout = '...') :
REFRESH DYNAMIC TABLE <schema_name.table_name> WITH (
refresh_guc_statement_timeout = '30 min'
);
Déclencher une actualisation manuelle
Exécutez l'instruction suivante pour déclencher une actualisation immédiate :
REFRESH DYNAMIC TABLE <schema_name.table_name>;
Si l'actualisation automatique est activée, une actualisation manuelle s'exécute en parallèle avec la tâche d'actualisation automatique planifiée. Les deux se terminent normalement. Le système ne conserve qu'une seule copie des dernières données.
Annuler une tâche d'actualisation
Tables dynamiques créées avec la nouvelle syntaxe 3,1
Annuler une tâche d'actualisation en cours
Interrogez l'identifiant query_job_id de la tâche en cours depuis hologres.hg_dynamic_table_refresh_log, puis annulez-la en utilisant hologres.hg_internal_cancel_query_job.
-- Step 1: Get the query_job_id
SELECT query_job_id
FROM hologres.hg_dynamic_table_refresh_log('<dt_name>')
WHERE status = 'RUNNING';
-- Step 2: Cancel the task
SELECT hologres.hg_internal_cancel_query_job('<query_job_id>');
Seul un superuser peut annuler une tâche d'actualisation en utilisant hologres.hg_internal_cancel_query_job .
Suspendre l'actualisation automatique pour une table
Pour arrêter toutes les tâches d'actualisation suivantes au niveau de la table, désactivez l'actualisation automatique :
ALTER DYNAMIC TABLE [IF EXISTS] [<schema>.]<table_name> SET (auto_refresh_enable = false);
Cette opération arrête toutes les futures tâches d'actualisation pour la table. Les données de la table dynamique ne seront pas mises à jour tant que l'actualisation automatique ne sera pas réactivée. Pour la réactiver, consultez ALTER DYNAMIC TABLE.
Tables dynamiques créées avec la syntaxe 3,0
Annuler une tâche d'actualisation en cours
Si une tâche d'actualisation prend trop de temps ou semble bloquée, annulez-la en utilisant pg_cancel_backend.
-- Cancel the refresh task by its process ID (pid)
SELECT pg_cancel_backend(<pid>);
Obtenez l'identifiant pid depuis hologres.hg_dynamic_table_refresh_activity ou hg_stat_activity. Pour plus d'informations, consultez Afficher les tâches d'actualisation
Pour annuler des tâches d'actualisation par lots, utilisez la même méthode que pour les requêtes classiques. Pour plus d'informations, consultez Terminer une requête .
Suspendre l'actualisation automatique pour une table
Pour arrêter toutes les tâches d'actualisation suivantes au niveau de la table :
ALTER DYNAMIC TABLE [IF EXISTS] [<schema>.]<table_name> SET (auto_refresh_enable = false);
Cette opération arrête toutes les futures tâches d'actualisation pour la table. Les données de la table dynamique ne seront pas mises à jour tant que l'actualisation automatique ne sera pas réactivée. Pour la réactiver, consultez ALTER DYNAMIC TABLE.