動的テーブルのデータソースとして機能するベーステーブルでデータが変更された場合は、データ変更を同期するために動的テーブルで更新タスクを実行する必要があります。 更新タスクは、構成された更新開始時刻と更新間隔に基づいてバックグラウンドで自動的に実行されます。 このトピックでは、動的テーブルの更新タスクをクエリおよび維持する方法について説明します。
更新タスクのクエリ
実行中の更新タスクのクエリ
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, -- 秒
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 システムビューから実行中のリフレッシュタスクをクエリできます。表示される内容は、設定したリフレッシュモードによって異なります。
完全データ更新:INSERT ステートメントが表示されます。
増分データ更新:更新タスクが表示されます。
メトリクスを使用して更新タスクのステータスを確認する
1 秒あたりのクエリ数(QPS)、1 秒あたりのレコード数(RPS)、レイテンシなどのメトリクスを使用して、更新タスクのステータスを確認できます。 コマンドタイプパラメータの値 refresh は、動的テーブルの更新タスクを示します。 メトリクスの詳細については、Hologres メトリクス をご参照ください。
サーバーレスコンピューティングリソースを使用して動的テーブルの更新タスクを実行する場合は、サーバーレスコンピューティング関連のメトリクスを表示してタスクのステータスを確認することもできます。
CloudMonitor で更新タスクのアラートルールを構成できます。 詳細については、CloudMonitor をご参照ください。
履歴更新タスクのクエリ
システムテーブル hologres.hg_dynamic_table_refresh_history の使用
hologres.hg_dynamic_table_refresh_history システムテーブルには、完全データリフレッシュ、増分データリフレッシュ、手動リフレッシュタスクなど、直近 1 か月以内のすべての履歴リフレッシュタスクが記録されます。
デフォルトでは、直近 1 か月間の履歴更新タスクが保持されます。 1 か月前に生成されたデータはクエリできません。
動的テーブルの所有者は、現在の動的テーブルの履歴更新タスクのみをクエリできます。 スーパーユーザーは、現在の Hologres インスタンス内のすべての動的テーブルの履歴更新タスクをクエリできます。
例 1:過去 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:過去 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 schema_name='<scehma_name>' and dynamic_table_name='<dynamic_table>' and refresh_start >= CURRENT_DATE - INTERVAL '1 day'
低速クエリログの使用
低速クエリログで動的テーブルの更新タスクをクエリできます。 コマンドタイプパラメータの値 refresh は、動的テーブルの更新タスクを示します。 詳細については、低速クエリログのクエリと分析 をご参照ください。
更新タスクの実行プランのクエリ
一般的なクエリと同様に、EXPLAIN ステートメントと EXPLAIN ANALYZE ステートメント を実行して、更新タスクの実行プランと実行の詳細をクエリできます。 これにより、更新タスクのパフォーマンスボトルネックを分析し、クエリを最適化できます。 サンプルコード:
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)更新タイムアウト期間を構成する
一般的なクエリと同様に、更新タスクのタイムアウト期間を構成できます。
テーブルレベルの設定
動的テーブルを作成するときにタイムアウト期間を設定すると、その設定は、作成されたテーブルのすべてのリフレッシュタスクに適用されます。 次の SQL 文では、パブリックデータセット tpch_10g を例として使用します。 文を実行する前に、tpch_10g パブリックデータセットのデータが Hologres にインポートされていることを確認してください。 詳細については、「パブリックデータセットのインポートタスクを作成する」をご参照ください。
-- テーブルを作成するときに、更新タスクのタイムアウト期間を構成します。
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 分です。
)
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;セッションレベルの設定
タイムアウト期間を手動で構成します。 SQL サンプルコード:
SET statement_timeout = <time>;
refresh DYNAMIC TABLE <dynamic_schema_name.dynamic_table_name>;詳細については、アクティブなクエリのタイムアウト期間の変更 をご参照ください。
更新タスクのキャンセル
実行中の更新タスクのキャンセル
リフレッシュタスクが長時間実行されているか、スタックしている場合は、pg_cancel_backend 関数を使用してタスクをキャンセルできます。
次のステートメントを実行して、実行中の単一の更新タスクをキャンセルできます。
// pid パラメータは、キャンセルする更新タスクの ID を指定します。
SELECT pg_cancel_backend(<pid>);pid パラメータは、更新タスクの ID を指定します。 更新タスクをクエリして ID(query_id)を取得できます。 詳細については、このトピックの更新タスクのクエリ セクションをご参照ください。
一般的なクエリと同じ方法で、実行中の複数の更新タスクを一度にキャンセルできます。 詳細については、クエリのキャンセル をご参照ください。
動的テーブルのすべての更新タスクのキャンセル
動的テーブルに更新タスクが構成されている場合、テーブルレベルで後続のすべての更新タスクをキャンセルできます。
ALTER DYNAMIC TABLE [IF EXISTS ] [<schema>.]<table_name> set (auto_refresh_enable=false);この操作を実行する際は注意してください。 そうしないと、データが更新されない可能性があります。