全部产品
Search
文档中心

实时数仓Hologres:Hologres Dynamic Table运维刷新任务

更新时间:Feb 04, 2026

当Dynamic Table的数据源基表发生变化时,需要通过刷新Dynamic Table来更新数据。Dynamic Table将根据设定的刷新开始时间和刷新间隔,自动在后台执行刷新任务。本文将为您介绍如何查看和维护Dynamic Table的刷新任务。

监控与告警

监控指标

自V4.0.8版本起,Dynamic Table提供以下监控指标,便于您运维刷新任务:

实例级别动态表刷新失败QPS(count/s)

表示实例内所有Dynamic Table的刷新失败QPS,用于反映整体刷新健康度。正常情况该指标应接近0;若持续非0或明显抬升,通常表示存在持续失败的刷新任务,建议您前往HoloWeb控制台,在Dynamic Table界面查看失败任务并尽快处理。

动态表数据延迟(s)

表示实例内每张Dynamic Table的数据相对上游基表最新数据(或预期时间点)的延迟,单位:秒,用于反映数据实时性。建议您根据业务需求设置合理的延迟告警阈值。若延迟持续上升,可能原因包括:

  • 刷新持续失败或已暂停自动刷新,请前往HoloWeb控制台的Dynamic Table管理界面排查。

  • 上游发生大数据量变更,实例资源不足导致刷新变慢,可结合Hologres监控与刷新时长等指标综合排查。

动态表正在运行的刷新持续时长(ms)

表示实例内每张Dynamic Table当前刷新任务已持续运行的时间,单位:毫秒,用于判断刷新周期是否变长。建议您按业务场景为不同表设置刷新持续时长告警。若该指标突然升高或长期明显高于历史水平,可重点排查实例资源瓶颈、上游数据量变化等因素。

动态表刷新失败QPM(count/m)

表示实例内每张Dynamic Table每分钟的刷新失败次数(分钟粒度),用于评估单表刷新稳定性。正常情况该指标应为0。偶发失败(如因系统压力、实例升级等)且后续刷新恢复成功时,一般可忽略;若某张表的该指标持续大于0,说明该表刷新任务长期异常,请根据Dynamic Table失败日志中的错误信息进行排查与处理。

告警

您可以通过云监控为Dynamic Table刷新任务配置告警规则,以便及时发现异常。具体操作请参见云监控

查看刷新任务

查看运行中的刷新任务

通过hologres.hg_dynamic_table_refresh_activity查看

您可以通过hologres.hg_dynamic_table_refresh_activity查看正在运行中的刷新任务(包括全量刷新和增量刷新),以及资源消耗等。hologres.hg_dynamic_table_refresh_activity系统表字段介绍详情,请参见hologres.hg_dynamic_table_refresh_activity系统表

说明

仅Hologres V3.0版本、V4.0.8及以上版本支持该系统表。

--查看当前正在运行的刷新任务
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;

通过hg_stat_activity查看

您可以通过hg_stat_activity系统视图查看正在运行中的刷新任务,在hg_stat_activity中不同的刷新模式显示存在差异:

  • 全量刷新:会展示INSERT语句。

  • 增量刷新:会展示Refresh任务。

通过监控指标查看刷新任务

您可以通过查看QPS、RPS、Latency等指标,确认Dynamic Table刷新任务的执行情况,其中Command Type为refresh,即为Dynamic Table的刷新任务。关于监控指标详情,请参见Hologres管控台的监控指标

若Dynamic Table刷新任务,在Serverless Computing资源中运行,您也可以Serverless Computing相关指标中进行查看。

说明

Dynamic Table刷新任务支持通过云监控,创建告警规则,详情请参见云监控

查看历史刷新任务

通过hologres.hg_dynamic_table_refresh_history查看

hologres.hg_dynamic_table_refresh_history系统表会记录近一个月,所有Dynamic Table刷新任务(包括全量刷新、增量刷新、手动刷新)的历史信息。hologres.hg_dynamic_table_refresh_history系统表字段介绍详情,请参见hologres.hg_dynamic_table_refresh_history 系统表

说明
  • 数据默认保留近一个月的记录,无法查询一个月之前的数据。

  • 表Owner仅能查看自身的刷新历史,而Superuser则具备查看所有刷新记录的权限。

  • 示例1:查看增量刷新过去一天的记录。

    --示例1:查看增量刷新过去一天的记录
    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;
    
  • 示例2:查看当前实例,过去1天所有的刷新任务。

    --查看实例内过去1天所有的刷新记录
    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'
  • 示例3:查看指定表过去一天的刷新记录。

    --查看某个表过去一天的刷新记录
    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='<scehma_name>' and dynamic_table_name='<dynamic_table>' and  refresh_start >= CURRENT_DATE - INTERVAL '1 day'
说明

对于3.0旧语法创建的全量模式Dynamic Table,hologres.hg_dynamic_table_refresh_history可能无法反映刷新的真实成功或失败状态,失败的刷新也可能展示为Success。可通过以下方式查询某张3.0语法全量Dynamic Table的真实刷新历史状态:

  1. hologres.hg_dynamic_table_properties获取cron_job_name

  2. 使用cron_job_namehologres.hg_user_cron_tasks中查询Cron任务执行记录。

-- 获取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';

-- 通过cron_job_name查询Cron任务执行记录
SELECT *
FROM hologres.hg_user_cron_tasks
WHERE jobname = '<cron_job_name>'
ORDER BY start_time DESC;

通过慢Query日志查看

您可以通过慢Query日志查看Dynamic Table的刷新任务,Command Type为refresh。通过慢Query日志查看详情,请参见慢Query日志查看与分析

查看刷新任务的执行计划

与普通Query一致,支持通过EXPLAIN和EXPLAIN ANALYZE查看刷新任务的执行计划和运行信息,以便于分析刷新任务的性能瓶颈,帮助业务进一步Query调优。示例如下:

 explain refresh dynamic table hmtest.dt_order_lineitem;
                                                                                                  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 < '199
6-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)

设置刷新超时时长

与普通Query一样,Dynamic Table的刷新任务也支持设置超时时长。

表级别设置

创建Dynamic Table表时,设置刷新任务超时时长,对该表的所有刷新任务都生效。以下SQL代码以tpch_10g公共数据集为例,在执行之前,请确保已成功导入tpch_10g公共数据集。具体操作,请参见新建公共数据集导入任务

--创建表时设置刷新任务超时时间。
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 mins'--刷新超时时间为30 mins
       ) 
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(*) asAScount_order
FROM
        hologres_dataset_tpch_10.lineitem
WHERE
        l_shipdate <= DATE '1998-12-01' - INTERVAL '120' DAY
GROUP BY
        l_returnflag,
        l_linestatus;

Session级别设置

手动刷新时,可通过Session级GUC设置超时时长,SQL示例如下。

SET statement_timeout = <time>;
refresh DYNAMIC TABLE <dynamic_schema_name.dynamic_table_name>;

关于更多设置详情,请参见修改活跃Query超时时间

通过 refresh with option 设置

手动刷新时,也可通过refresh ... with (refresh_guc_statement_timeout = '...')为当次刷新指定超时时间。示例如下。

REFRESH DYNAMIC TABLE <schema_name.table_name> WITH (
    refresh_guc_statement_timeout = '30 mins'
);

手动刷新

支持对Dynamic Table执行手动刷新,语法如下:

REFRESH DYNAMIC TABLE <schema_name.table_name>;
说明

若表属性中已开启自动刷新,同时执行手动刷新时,相当于与自动刷新并行执行,两者均可正常执行,系统最终保证仅有一份最新数据,不会产生多份数据。

取消刷新任务

3.1新语法创建的Dynamic Table

取消正在运行的刷新任务

对于3.1新语法创建的Dynamic Table,可先通过hologres.hg_dynamic_table_refresh_log查询正在运行的刷新任务的query_job_id,再通过hologres.hg_internal_cancel_query_job取消该刷新任务。

-- 获取query_job_id
SELECT query_job_id
FROM hologres.hg_dynamic_table_refresh_log('<dt_name>')
WHERE status = 'Running';

-- 根据query_job_id取消对应的刷新任务
SELECT hologres.hg_internal_cancel_query_job('<query_job_id>');
说明

仅Superuser可以通过hologres.hg_internal_cancel_query_job取消刷新任务。

取消表的所有刷新任务

如果Dynamic Table已设置刷新任务,可执行ALTER TABLE在表级别取消后续所有刷新任务。若需重新开启刷新,请参见ALTER DYNAMIC TABLE

ALTER DYNAMIC TABLE [ IF EXISTS ] [<schema>.]<table_name> SET (auto_refresh_enable=false);
重要

请谨慎操作,否则可能导致后续数据无法更新。

3.0语法创建的Dynamic Table

取消正在运行的刷新任务

如果您发现刷新任务长时间运行未结束或出现卡顿等问题,可通过pg_cancel_backend取消正在运行的刷新任务。

您可以通过如下命令,取消单个正在运行的刷新任务。

-- pid为刷新任务ID,可通过查看刷新任务获取query_id
SELECT pg_cancel_backend(<pid>);

上述参数pid为刷新任务ID,您可通过查看刷新任务获取刷新任务ID(query_id),详情请参见查看刷新任务

说明

批量取消正在运行的刷新任务,同普通Query的方式相同,详情请参见终止Query

取消表的所有刷新任务

如果Dynamic Table已经设置了刷新任务,您可以通过ALTER DYNAMIC TABLE命令,在表级别取消后续所有的刷新任务。

ALTER DYNAMIC TABLE [IF EXISTS ] [<schema>.]<table_name> set (auto_refresh_enable=false);
重要

请谨慎操作,否则可能导致后续数据无法更新。