當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);
請謹慎操作,否則可能導致後續資料無法更新。