全部產品
Search
文件中心

Hologres:Hologres Dynamic Table營運重新整理任務

更新時間:Sep 19, 2024

當Dynamic Table的資料來源基表發生變化時,需要通過重新整理Dynamic Table來更新資料。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系統資料表

--查看當前正在啟動並執行重新整理任務
SELECT
    pid,
    query_id,
    refresh_mode,
    'RUNNING' as status,
    refresh_start,
    extract(epoch from duration) as duration, -- seconds
    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重新整理任務支援通過CloudMonitor,建立警示規則,詳情請參見CloudMonitor

查看歷史重新整理任務

通過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'

通過慢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)

手動重新整理

支援對Dynamic Table執行手動重新整理,文法如下:

refresh DYNAMIC TABLE <dynamic_schema_name.dynamic_table_name>;
說明

如果表屬性中設定了自動重新整理,同時又執行了手動重新整理,則相當於並存執行重新整理操作。兩者均可正常執行,系統最終將確保只有一份最新的資料,不會產生多份資料的情況。

設定重新整理逾時時間長度

與普通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層級設定

手動設定逾時時間長度,SQL樣本如下。

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

關於更多設定詳情,請參見修改活躍Query逾時時間

取消重新整理任務

取消正在啟動並執行重新整理任務

如果您發現重新整理任務長時間運行未結束或出現卡頓等問題,可以通過pg_cancel_backend取消正在啟動並執行重新整理任務。

您可以通過如下命令,取消單個正在啟動並執行重新整理任務。

// pid為重新整理任務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);
重要

請謹慎操作,否則可能導致後續資料無法更新。