本文為您介紹如何建立Dynamic Table。
注意事項
Dynamic Table的使用限制請參見Dynamic Table支援範圍和限制。
從Hologres V3.1版本開始,建立Dynamic Table預設使用新文法。對於V3.0版本中已存在的Dynamic Table,僅支援執行ALTER操作,不支援使用V3.0版本的文法建立表。非分區表可以通過文法轉換命令,將V3.0版本的文法轉換成V3.1版本的新文法,如果是分區表,請手動重新建立。
從Hologres V3.1版本開始,增量重新整理的Dynamic Table需重新建立,您可以通過文法轉換命令進行重建。
從Hologres V3.1版本開始,引擎自適應最佳化Dynamic Table的Refresh執行過程,使Refresh更加穩定地執行。因此,與Refresh相關的Query ID出現負數的情況屬於正常現象。
文法
V3.1及以上版本(新文法)
從Hologres V3.1版本開始,僅支援使用新文法建表。
建表文法
從Hologres V3.1版本開始,Dynamic Table的建表文法如下:
CREATE DYNAMIC TABLE [ IF NOT EXISTS ] [<schema_name>.]<table_name>
[ (<col_name> [, ...] ) ]
[LOGICAL PARTITION BY LIST(<partition_key>)]
WITH (
-- dynamic table的屬性
freshness = '<num> {minutes | hours}', -- 必填
[auto_refresh_enable = {true | false},] -- 非必填
[auto_refresh_mode = {'full' | 'incremental' | 'auto'},] -- 非必填
[base_table_cdc_format = {'stream' | 'binlog'},] -- 非必填
[auto_refresh_partition_active_time = '<num> {minutes | hours | days}',] -- 非必填
[partition_key_time_format = {'YYYYMMDDHH24' | 'YYYY-MM-DD-HH24' | 'YYYY-MM-DD_HH24' | 'YYYYMMDD' | 'YYYY-MM-DD' | 'YYYYMM' | 'YYYY-MM' | 'YYYY'},] --非必填
[computing_resource = {'local' | 'serverless' | '<warehouse_name>'},] -- 非必填,僅Hologres V4.0.7及以上版本支援參數值為warehouse_name。
[refresh_guc_hg_experimental_serverless_computing_required_cores=xxx,]--非必填,計算資源規格
[refresh_guc_<guc_name> = '<guc_value>',] -- 非必填
-- 通用屬性
[orientation = {'column' | 'row' | 'row,column'},]
[table_group = '<tableGroupName>',]
[distribution_key = '<columnName>[,...]]',]
[clustering_key = '<columnName>[:asc] [,...]',]
[event_time_column = '<columnName> [,...]',]
[bitmap_columns = '<columnName> [,...]',]
[dictionary_encoding_columns = '<columnName> [,...]',]
[time_to_live_in_seconds = '<non_negative_literal>',]
[storage_mode = {'hot' | 'cold'},]
)
AS
<query>; -- query的定義參數說明
重新整理模式與資源
參數名 | 描述 | 是否必填 | 預設值 |
freshness | 資料的新鮮度,單位為minutes | hours,最小值為1mins,引擎會根據每次的Refresh時間、設定的freshness值,自動進行下一次Refresh,相比設定interval重新整理周期,freshness會更加自動化地最大程度保障資料的新鮮度。 | 是 | 無 |
auto_refresh_mode | 重新整理模式。取值如下: | 否 | auto |
auto_refresh_enable | 開啟或關閉自動重新整理。取值為:
| 否 | true |
base_table_cdc_format | 增量重新整理消費基表的方式。
說明
| 否 | stream |
computing_resource | 詳見設定Dynamic Table重新整理資源中的參數說明。 | 否 | serverless |
refresh_guc_<guc_name> | 支援對Refresh設定GUC參數,支援的GUC請參見GUC參數。 | 否 | 無 |
分區屬性
邏輯分區參數
參數名 | 描述 | 是否必填 | 預設值 |
LOGICAL PARTITION BY LIST(<partition_key>) | 建立Dynamic Table為邏輯分區表,還需要為分區表設定 | 否 | 無 |
auto_refresh_partition_active_time | 分區的重新整理範圍。取值單位包括minutes | hours | days。系統會根據設定的auto_refresh_partition_active_time,從目前時間開始追溯歷史分區,自動重新整理範圍內的分區資料。 活躍分區:是指 說明
| 是 |
即允許基表的資料延遲為1小時,例如:如果按天分區,則預設值為25小時(1 day + 1 hour)。 |
partition_key_time_format | 分區格式,當Dynamic Table為邏輯分區表時,系統會根據指定的分區格式產生對應的分區。分區欄位支援的類型及對應的資料格式如下:
| 是 | 無 |
物理分區參數
參數名 | 描述 | 是否必填 | 預設值 |
PARTITION BY LIST(<partition_key>) | 建立Dynamic Table為普通分區表。 相比邏輯分區Dynamic Table,普通分區Dynamic Table沒有動態分區的能力,使用上存在一定的限制,建議優先使用邏輯分區。二者區別請參見CREATE LOGICAL PARTITION TABLE。 重要 從Hologres V3.1版本開始,使用新文法時,不支援建立Dynamic Table為物理分區表。 | 否 | 無 |
表屬性參數
參數 | 描述 | 是否必填 | 預設值 | |
full | incremental | |||
col_name | Dynamic Table的欄位名。 可以顯式指定Dynamic Table的列名,但是不能指定列的屬性和資料類型,引擎會自動推導。 說明 若指定了列的屬性和資料類型,會導致引擎推導不正確。 | 否 | Query列名 | Query列名 |
orientation | 指定Dynamic Table的儲存模式,取值為 | 否 | column | column |
table_group | 指定Dynamic Table所在的Table Group,預設為當前資料庫下的Default Table Group,詳情請參見Table Group與Shard Count操作指南。 | 否 | 預設Table Group名稱 | 預設Table Group名稱 |
distribution_key | 指定Dynamic Table的Distribution Key,詳情請參見分布鍵Distribution Key。 | 否 | 無 | 無 |
clustering_key | 指定Dynamic Table的Clustering Key,詳情請參見聚簇索引Clustering Key。 | 否 | 允許設定,有預設推導值。 | 允許設定,有預設推導值。 |
event_time_column | 指定Dynamic Table的event_time_column,詳情請參見Event Time Column(Segment Key)。 | 否 | 無 | 無 |
bitmap_columns | 指定Dynamic Table的bitmap_columns,詳情請參見位元影像索引Bitmap。 | 否 | TEXT類型欄位 | TEXT類型欄位 |
dictionary_encoding_columns | 指定Dynamic Table的dictionary_encoding_columns,詳情請參見字典編碼Dictionary Encoding。 | 否 | TEXT類型欄位 | TEXT類型欄位 |
time_to_live_in_seconds | 指定Dynamic Table資料的生命週期。 | 否 | 永久 | 永久 |
storage_mode | Dynamic Table的儲存模式,取值如下:
說明 儲存模式詳情請參見資料階層式存放區。 | 否 | hot | hot |
binlog_level | Dynamic Table是否開啟Binlog。關於binlog的使用見訂閱Hologres Binlog。 說明
| 否 | none | none |
binlog_ttl | Dynamic Table開啟Binlog後,Binlog的生命週期。 | 否 | 2592000 | 2592000 |
Query
Dynamic Table中資料產生的Query,設定的重新整理模式不同,支援的Query類型和基表類型也不同,詳情請參見Dynamic Table支援範圍和限制。
V3.0
建表文法
Hologres V3.0版本Dynamic Table的建表文法如下:
CREATE DYNAMIC TABLE [IF NOT EXISTS] <schema.tablename>(
[col_name],
[col_name]
) [PARTITION BY LIST (col_name)]
WITH (
[refresh_mode='[full|incremental]',]
[auto_refresh_enable='[true|false',]
--增量重新整理專用參數:
[incremental_auto_refresh_schd_start_time='[immediate|<timestamptz>]',]
[incremental_auto_refresh_interval='[<num> {minute|minutes|hour|hours]',]
[incremental_guc_hg_computing_resource='[ local | serverless]',]
[incremental_guc_hg_experimental_serverless_computing_required_cores='<num>',]
--全量重新整理專用參數:
[full_auto_refresh_schd_start_time='[immediate|<timestamptz>]',]
[full_auto_refresh_interval='[<num> {minute|minutes|hour|hours]',]
[full_guc_hg_computing_resource='[ local | serverless]',]--hg_full_refresh_computing_resource預設serverless,可以db層級設定,使用者可以不設定
[full_guc_hg_experimental_serverless_computing_required_cores='<num>',]
--共用參數,允許設定guc:
[refresh_guc_<guc>='xxx]',]
-- Dynamic Table的通用屬性:
[orientation = '[column]',]
[table_group = '[tableGroupName]',]
[distribution_key = 'columnName[,...]]',]
[clustering_key = '[columnName{:asc]} [,...]]',]
[event_time_column = '[columnName [,...]]',]
[bitmap_columns = '[columnName [,...]]',]
[dictionary_encoding_columns = '[columnName [,...]]',]
[time_to_live_in_seconds = '<non_negative_literal>',]
[storage_mode = '[hot | cold]']
)
AS
<query> --query的定義參數說明
重新整理模式與資源
參數分類 | 參數名 | 描述 | 是否必填 | 預設值 |
共用重新整理參數 | refresh_mode | 指定資料的重新整理模式,支援full、incremental兩種重新整理模式。 若不設定該參數,則表示不進行重新整理。 | 否 | 無 |
auto_refresh_enable | 是否開啟自動重新整理。取值為:
| 否 | false | |
refresh_guc_<guc> | 支援對Refresh設定GUC參數,支援的GUC請參見GUC參數。 說明 例如GUC參數中 | 否 | 無 | |
增量重新整理(incremental) | incremental_auto_refresh_schd_start_time | 增量重新整理的開始時間。取值為:
| 否 | immediate |
incremental_auto_refresh_interval | 增量重新整理的時間間隔,單位有minute、minutes、hour和hours。
| 否 | 無 | |
incremental_guc_hg_computing_resource | 指定執行增量重新整理的計算資源,取值為:
說明 支援使用 | 否 | local | |
incremental_guc_hg_experimental_serverless_computing_required_cores | 如果使用Serverless資源執行重新整理,則需要設定重新整理的計算資源量。 說明 不同規格的執行個體可使用的Serverless資源有一定的限制,詳情請參見Serverless Computing使用指南。 | 否 | 無 | |
全量重新整理(full) | full_auto_refresh_schd_start_time | 全量重新整理的開始時間。取值為:
| 否 | immediate |
full_auto_refresh_interval | 全量重新整理的時間間隔,單位有minute、minutes、hour和hours。
| 否 | 無 | |
full_guc_hg_computing_resource | 指定執行全量重新整理的計算資源,取值為:
說明 支援使用 | 否 | local | |
full_guc_hg_experimental_serverless_computing_required_cores | 如果使用Serverless執行重新整理,則需要設定重新整理的計算資源量。 說明 不同規格的執行個體可使用的Serverless資源有一定的限制,詳情請參見Serverless Computing使用指南。 | 否 | 無 |
表屬性參數
參數 | 描述 | 是否必填 | 預設值 | |
full | incremental | |||
col_name | Dynamic Table的欄位名。 可以顯式指定Dynamic Table的列名,但是不能指定列的屬性和資料類型,引擎會自動推導。 說明 若指定了列的屬性和資料類型,會導致引擎推導不正確。 | 否 | Query列名 | Query列名 |
orientation | 指定Dynamic Table的儲存模式。取值為 | 否 | column | column |
table_group | 指定Dynamic Table所在的Table Group,預設為當前資料庫下的Default Table Group,詳情請參見Table Group與Shard Count操作指南。 | 否 | 預設Table Group名稱 | 預設Table Group名稱 |
distribution_key | 指定Dynamic Table的Distribution Key,詳情請參見分布鍵Distribution Key。 | 否 | 無 | 無 |
clustering_key | 指定Dynamic Table的Clustering Key,詳情請參見聚簇索引Clustering Key。 | 否 | 允許設定,有預設推導值。 | 允許設定,有預設推導值。 |
event_time_column | 指定Dynamic Table的event_time_column,詳情請參見Event Time Column(Segment Key)。 | 否 | 無 | 無 |
bitmap_columns | 指定Dynamic Table的bitmap_columns,詳情請參見位元影像索引Bitmap。 | 否 | TEXT類型欄位 | TEXT類型欄位 |
dictionary_encoding_columns | 指定Dynamic Table的dictionary_encoding_columns,詳情請參見字典編碼Dictionary Encoding。 | 否 | TEXT類型欄位 | TEXT類型欄位 |
time_to_live_in_seconds | 指定Dynamic Table資料的生命週期。 | 否 | 永久 | 永久 |
storage_mode | Dynamic Table的儲存模式,取值如下:
說明 儲存模式詳情請參見資料階層式存放區。 | 否 | hot | hot |
PARTITION BY LIST | 是否為分區表,支援建立Dynamic Table分區表,使用方式與普通分區表相同,不同分區子表可以設定不同的重新整理模式,來滿足業務不同情境的時效性需求。 | 否 | 非分區表 | 非分區表 |
Query
Dynamic Table中資料產生的Query,設定的重新整理模式不同,支援的Query類型和基表類型也不同,詳情請參見Dynamic Table支援範圍和限制。
增量重新整理
增量重新整理通過自動感知基表資料的變化,將Query中的資料以增量的方式寫入Dynamic Table。相比於全量重新整理,增量重新整理處理的資料量更少,處理時效性會更高。在實際應用中,如果有分鐘級近即時資料查詢的需求,更推薦使用增量重新整理模式,但在使用增量Dynamic Table時需要注意如下幾點:
基表的限制:
Hologres V3.1版本預設使用Stream模式消費增量資料。如果您的基表在V3.0版本已經開啟過Binlog,建議及時關閉,防止儲存成本增加。
V3.0版本,需要為基表開啟Binlog,如果是維表JOIN,維表無需開啟Binlog。基表開啟Binlog後,會有一定的儲存開銷,您可參考表格儲存體明細查詢Binlog佔用儲存。
開啟增量重新整理後,系統會在後台產生一張狀態表,用於記錄中間彙總結果,關於狀態表技術原理請參見Dynamic Table。狀態表會儲存中間彙總資料,因此會佔用一定的儲存,查看儲存請參見查看Dynamic Table表結構和血緣。
當前增量重新整理支援的Query和運算元詳情,請參見Dynamic Table支援範圍和限制。
多表JOIN(雙流JOIN)
雙流JOIN即多表JOIN,語義與OLAP查詢相同,基於HASH JOIN實現,支援INNER JOIN、LEFT/RIGHT/FULL OUTER JOIN四種JOIN類型。
V3.1版本
從Hologres V3.1版本開始,雙流JOIN的GUC預設開啟,無需再手動設定。
樣本SQL如下:
CREATE TABLE users (
user_id INT,
user_name TEXT,
PRIMARY KEY (user_id)
);
INSERT INTO users VALUES(1, 'hologres');
CREATE TABLE orders (
order_id INT,
user_id INT,
PRIMARY KEY (order_id)
);
INSERT INTO orders VALUES(1, 1);
CREATE DYNAMIC TABLE dt WITH (
auto_refresh_mode = 'incremental',
freshness='10 minutes'
)
AS
SELECT order_id, orders.user_id, user_name
FROM orders LEFT JOIN users ON orders.user_id = users.user_id;
-- 重新整理之後可以看到一條關聯資料
REFRESH TABLE dt;
SELECT * FROM dt;
order_id | user_id | user_name
----------+---------+-----------
1 | 1 | hologres
(1 row)
UPDATE users SET user_name = 'dynamic table' WHERE user_id = 1;
INSERT INTO orders VALUES(4, 1);
-- 重新整理之後可以看到兩條關聯資料,維表更新對所有資料生效,可以訂正已關聯資料
REFRESH TABLE dt;
SELECT * FROM dt;返回結果如下:
order_id | user_id | user_name
----------+---------+---------------
1 | 1 | dynamic table
4 | 1 | dynamic table
(2 rows)V3.0版本
Hologres從V3.0.26版本開始支援多表JOIN(雙流JOIN),在使用之前請先升級執行個體版本,同時需要執行如下GUC開啟雙流JOIN。
-- Session層級開啟
SET hg_experimental_incremental_dynamic_table_enable_hash_join TO ON;
--DB層級開啟,建立串連生效
ALTER database <db_name> SET hg_experimental_incremental_dynamic_table_enable_hash_join TO ON;樣本SQL如下:
CREATE TABLE users (
user_id INT,
user_name TEXT,
PRIMARY KEY (user_id)
) WITH (binlog_level = 'replica');
INSERT INTO users VALUES(1, 'hologres');
CREATE TABLE orders (
order_id INT,
user_id INT,
PRIMARY KEY (order_id)
) WITH (binlog_level = 'replica');
INSERT INTO orders VALUES(1, 1);
CREATE DYNAMIC TABLE dt WITH (refresh_mode = 'incremental')
AS
SELECT order_id, orders.user_id, user_name
FROM orders LEFT JOIN users ON orders.user_id = users.user_id;
-- 重新整理之後可以看到一條關聯資料
REFRESH TABLE dt;
SELECT * FROM dt;
order_id | user_id | user_name
----------+---------+-----------
1 | 1 | hologres
(1 row)
UPDATE users SET user_name = 'dynamic table' WHERE user_id = 1;
INSERT INTO orders VALUES(4, 1);
-- 重新整理之後可以看到兩條關聯資料,維表更新對所有資料生效,可以訂正已關聯資料
REFRESH TABLE dt;
SELECT * FROM dt;返回結果如下:
order_id | user_id | user_name
----------+---------+---------------
1 | 1 | dynamic table
4 | 1 | dynamic table
(2 rows)維表JON
維表JOIN的語義是:對每條資料,只會關聯當時維表的最新版本資料,即JOIN行為只發生在處理時間(Processing Time)。如果JOIN行為發生後,維表中的資料發生了變化(新增、更新或刪除),則已關聯的維表資料不會同步更新。樣本SQL如下:
維表的JOIN操作與參與表的資料量無關,只要在SQL中採用維表的JOIN語義即可。
V3.1版本
CREATE TABLE users (
user_id INT,
user_name TEXT,
PRIMARY KEY (user_id)
);
INSERT INTO users VALUES(1, 'hologres');
CREATE TABLE orders (
order_id INT,
user_id INT,
PRIMARY KEY (order_id)
) WITH (binlog_level = 'replica');
INSERT INTO orders VALUES(1, 1);
CREATE DYNAMIC TABLE dt_join_2 WITH (
auto_refresh_mode = 'incremental',
freshness='10 minutes')
AS
SELECT order_id, orders.user_id, user_name
-- FOR SYSTEM_TIME AS OF PROCTIME()用於標識users做為維表
FROM orders LEFT JOIN users FOR SYSTEM_TIME AS OF PROCTIME()
ON orders.user_id = users.user_id;
-- 重新整理之後可以看到一條關聯資料
REFRESH TABLE dt_join_2;
SELECT * FROM dt_join_2;
order_id | user_id | user_name
----------+---------+-----------
1 | 1 | hologres
(1 row)
UPDATE users SET user_name = 'dynamic table' WHERE user_id = 1;
INSERT INTO orders VALUES(4, 1);
-- 重新整理之後可以看到兩條關聯資料,維表更新只對新增資料生效,無法訂正已關聯資料
REFRESH TABLE dt_join_2;
SELECT * FROM dt_join_2;返回結果如下:
order_id | user_id | user_name
----------+---------+---------------
1 | 1 | hologres
4 | 1 | dynamic table
(2 rows)V3.0版本
CREATE TABLE users (
user_id INT,
user_name TEXT,
PRIMARY KEY (user_id)
);
INSERT INTO users VALUES(1, 'hologres');
CREATE TABLE orders (
order_id INT,
user_id INT,
PRIMARY KEY (order_id)
) WITH (binlog_level = 'replica');
INSERT INTO orders VALUES(1, 1);
CREATE DYNAMIC TABLE dt_join_2 WITH (refresh_mode = 'incremental')
AS
SELECT order_id, orders.user_id, user_name
-- FOR SYSTEM_TIME AS OF PROCTIME()用於標識users做為維表
FROM orders LEFT JOIN users FOR SYSTEM_TIME AS OF PROCTIME()
ON orders.user_id = users.user_id;
-- 重新整理之後可以看到一條關聯資料
REFRESH TABLE dt_join_2;
SELECT * FROM dt_join_2;
order_id | user_id | user_name
----------+---------+-----------
1 | 1 | hologres
(1 row)
UPDATE users SET user_name = 'dynamic table' WHERE user_id = 1;
INSERT INTO orders VALUES(4, 1);
-- 重新整理之後可以看到兩條關聯資料,維表更新只對新增資料生效,無法訂正已關聯資料
REFRESH TABLE dt_join_2;
SELECT * FROM dt_join_2;返回結果如下:
order_id | user_id | user_name
----------+---------+---------------
1 | 1 | hologres
4 | 1 | dynamic table
(2 rows)增量消費湖表(Paimon)
增量重新整理支援消費Paimon湖表,實現湖倉一體化。
支援External Dynamic Table增量讀寫湖倉資料並自動增量回寫至湖(Paimon),實現湖上資料快速加工,查詢加速和自動回寫的能力,簡化湖上資料加工體驗,降低成本。詳情見External Dynamic Table介紹。
全增量一體化重新整理
當前增量Dynamic Table也支援全增量一體消費,即首先消費Query命中的基表全量資料,再消費基表新增的資料。
V3.1版本
V3.1版本,全增量一體化重新整理預設開啟。使用樣本如下:
--準備基表,並開啟binlog插入資料
CREATE TABLE base_sales(
day TEXT NOT NULL,
hour INT,
user_id BIGINT,
ts TIMESTAMPTZ,
amount FLOAT,
pk text NOT NULL PRIMARY KEY
);
-- 為基表匯入資料
INSERT INTO base_sales values ('2024-08-29',1,222222,'2024-08-29 16:41:19.141528+08',5,'ddd');
-- 再為基表匯入增量資料
INSERT INTO base_sales VALUES ('2024-08-29',2,3333,'2024-08-29 17:44:19.141528+08',100,'aaaaa');
-- 建立自動重新整理的增量Dynamic Table,並開啟全增量資料一體消費的GUC
CREATE DYNAMIC TABLE sales_incremental
WITH (
auto_refresh_mode='incremental',
freshness='10 minutes'
)
AS
SELECT day, hour, SUM(amount), COUNT(1)
FROM base_sales
GROUP BY day, hour;對比資料一致性:
查詢基表
SELECT day, hour, SUM(amount), COUNT(1) FROM base_sales GROUP BY day, hour;返回結果:
day hour sum count 2024-08-29 2 100 1 2024-08-29 1 5 1查詢Dynamic Table
SELECT * FROM sales_incremental;返回結果:
day hour sum count 2024-08-29 1 5 1 2024-08-29 2 100 1
V3.0版本
V3.0版本,需要開啟GUC實現全增量一體化重新整理。使用樣本如下:
--準備基表,並開啟binlog插入資料
CREATE TABLE base_sales(
day TEXT NOT NULL,
hour INT,
user_id BIGINT,
ts TIMESTAMPTZ,
amount FLOAT,
pk text NOT NULL PRIMARY KEY
);
-- 為基表匯入資料
INSERT INTO base_sales values ('2024-08-29',1,222222,'2024-08-29 16:41:19.141528+08',5,'ddd');
-- 為基表開啟Binlog
ALTER TABLE base_sales SET (binlog_level = replica);
-- 再為基表匯入增量資料
INSERT INTO base_sales VALUES ('2024-08-29',2,3333,'2024-08-29 17:44:19.141528+08',100,'aaaaa');
-- 建立自動重新整理的增量Dynamic Table,並開啟全增量資料一體消費的GUC
CREATE DYNAMIC TABLE sales_incremental
WITH (
refresh_mode='incremental',
incremental_auto_refresh_schd_start_time = 'immediate',
incremental_auto_refresh_interval = '3 minutes',
incremental_guc_hg_experimental_enable_hybrid_incremental_mode= 'true'
)
AS
SELECT day, hour, SUM(amount), COUNT(1)
FROM base_sales
GROUP BY day, hour;對比資料一致性:
查詢基表
SELECT day, hour, SUM(amount), COUNT(1) FROM base_sales GROUP BY day, hour;返回結果:
day hour sum count 2024-08-29 2 100 1 2024-08-29 1 5 1查詢Dynamic Table
SELECT * FROM sales_incremental;返回結果:
day hour sum count 2024-08-29 1 5 1 2024-08-29 2 100 1
全量重新整理
全量重新整理會將Query中的資料以全量的方式寫入Dynamic Table。相比於增量重新整理,全量重新整理的優勢在於:
支援更多的基表類型。
支援更豐富的Query類型、運算元支援等。
全量重新整理相比增量重新整理,處理的資料量更多,消耗的資源可能更多,因此更推薦的應用情境包括:定期報表查看、定期回刷資料等。
更多關於全量重新整理的資訊請參見全量重新整理。
使用樣本
V3.1版本
樣本1:建立增量重新整理Dynamic Table
執行下述操作前,請先參考一鍵匯入公用資料集將tpch_10g公用資料集的資料匯入至Hologres。
建立增量Dynamic Table之前,需要為基表開啟Binlog(維表無需開啟)。
--建立單表增量重新整理的dynamic table,並指定開始重新整理時間,每3min重新整理一次。
CREATE DYNAMIC TABLE public.tpch_q1_incremental
WITH (
auto_refresh_mode='incremental',
freshness='3 minutes'
) AS SELECT
l_returnflag,
l_linestatus,
COUNT(*) AS count_order
FROM
hologres_dataset_tpch_10g.lineitem
WHERE
l_shipdate <= DATE '1998-12-01' - INTERVAL '120' DAY
GROUP BY
l_returnflag,
l_linestatus;樣本2:建立多表JOIN的增量重新整理Dynamic Table
執行下述操作前,請先參考一鍵匯入公用資料集將tpch_10g公用資料集的資料匯入至Hologres。
在建立增量Dynamic Table之前,需要為基表開啟Binlog(維表不需要開啟)。
--建立多表join的增量重新整理dynamic table
CREATE DYNAMIC TABLE dt_join
WITH (
auto_refresh_mode='incremental',
freshness='30 minutes'
)
AS
SELECT
l_shipmode,
SUM(CASE
WHEN o_orderpriority = '1-URGENT'
OR o_orderpriority = '2-HIGH'
THEN 1
ELSE 0
END) AS high_line_count,
SUM(CASE
WHEN o_orderpriority <> '1-URGENT'
AND o_orderpriority <> '2-HIGH'
THEN 1
ELSE 0
END) AS low_line_count
FROM
hologres_dataset_tpch_10g.orders,
hologres_dataset_tpch_10g.lineitem
WHERE
o_orderkey = l_orderkey
AND l_shipmode IN ('FOB', 'AIR')
AND l_commitdate < l_receiptdate
AND l_shipdate < l_commitdate
AND l_receiptdate >= DATE '1997-01-01'
AND l_receiptdate < DATE '1997-01-01' + INTERVAL '1' YEAR
GROUP BY
l_shipmode;樣本3:建立自動重新整理Dynamic Table
將Dynamic Table設定為自動重新整理,引擎自動選擇重新整理模式,優先使用增量重新整理,若不支援增量重新整理,則退化為全量重新整理。
執行下述操作前,請先參考一鍵匯入公用資料集將tpch_10g公用資料集的資料匯入至Hologres。
--建立自動重新整理的dynamic table,引擎自動選擇重新整理模型。執行的結果是使用增量重新整理模式
CREATE DYNAMIC TABLE thch_q6_auto
WITH (
auto_refresh_mode='auto',
freshness='1 hours'
)
AS
SELECT
SUM(l_extendedprice * l_discount) AS revenue
FROM
hologres_dataset_tpch_100g.lineitem
WHERE
l_shipdate >= DATE '1996-01-01'
AND l_shipdate < DATE '1996-01-01' + INTERVAL '1' YEAR
AND l_discount BETWEEN 0.02 - 0.01 AND 0.02 + 0.01
AND l_quantity < 24;樣本4:建立邏輯分區Dynamic Table
以即時交易大屏為例,業務通常會有近即時查看當天資料,同時又需要修正歷史資料的即時離線一體化分析需求(詳情請參見業務與資料認知)。我們通常使用Dynamic Table邏輯分區來實現該情境。具體方案如下:
基表是按天分區,最新分區是Flink即時/近即時寫入,歷史分區資料從MaxCompute寫入。
Dynamic Table基於基表建立,使用邏輯分區表,最新的2個分區是活躍分區,通過增量重新整理模式重新整理,滿足業務的近即時資料分析需求
歷史分區是不活躍的分區,使用全量重新整理模式,如果源錶的歷史分區有進行過資料修正/回刷,可以將歷史分區使用全量重新整理進行回刷
本樣本使用Github公用資料集進行示範。
準備基表。
基表的最新資料來源於Flink即時寫入,詳細操作流程請參見基於GitHub公開事件數目據集的離線即時一體化實踐。
DROP TABLE IF EXISTS gh_realtime_data; BEGIN; CREATE TABLE gh_realtime_data ( id BIGINT, actor_id BIGINT, actor_login TEXT, repo_id BIGINT, repo_name TEXT, org_id BIGINT, org_login TEXT, type TEXT, created_at timestamp with time zone NOT NULL, action TEXT, iss_or_pr_id BIGINT, number BIGINT, comment_id BIGINT, commit_id TEXT, member_id BIGINT, rev_or_push_or_rel_id BIGINT, ref TEXT, ref_type TEXT, state TEXT, author_association TEXT, language TEXT, merged BOOLEAN, merged_at TIMESTAMP WITH TIME ZONE, additions BIGINT, deletions BIGINT, changed_files BIGINT, push_size BIGINT, push_distinct_size BIGINT, hr TEXT, month TEXT, year TEXT, ds TEXT, PRIMARY KEY (id,ds) ) PARTITION BY LIST (ds); CALL set_table_property('public.gh_realtime_data', 'distribution_key', 'id'); CALL set_table_property('public.gh_realtime_data', 'event_time_column', 'created_at'); CALL set_table_property('public.gh_realtime_data', 'clustering_key', 'created_at'); COMMENT ON COLUMN public.gh_realtime_data.id IS '事件ID'; COMMENT ON COLUMN public.gh_realtime_data.actor_id IS '事件發起人ID'; COMMENT ON COLUMN public.gh_realtime_data.actor_login IS '事件發起人登入名稱'; COMMENT ON COLUMN public.gh_realtime_data.repo_id IS 'repoID'; COMMENT ON COLUMN public.gh_realtime_data.repo_name IS 'repo名稱'; COMMENT ON COLUMN public.gh_realtime_data.org_id IS 'repo所屬組織ID'; COMMENT ON COLUMN public.gh_realtime_data.org_login IS 'repo所屬組織名稱'; COMMENT ON COLUMN public.gh_realtime_data.type IS '事件類型'; COMMENT ON COLUMN public.gh_realtime_data.created_at IS '事件發生時間'; COMMENT ON COLUMN public.gh_realtime_data.action IS '事件行為'; COMMENT ON COLUMN public.gh_realtime_data.iss_or_pr_id IS 'issue/pull_request ID'; COMMENT ON COLUMN public.gh_realtime_data.number IS 'issue/pull_request 序號'; COMMENT ON COLUMN public.gh_realtime_data.comment_id IS 'comment(評論)ID'; COMMENT ON COLUMN public.gh_realtime_data.commit_id IS '提交記錄ID'; COMMENT ON COLUMN public.gh_realtime_data.member_id IS '成員ID'; COMMENT ON COLUMN public.gh_realtime_data.rev_or_push_or_rel_id IS 'review/push/release ID'; COMMENT ON COLUMN public.gh_realtime_data.ref IS '建立/刪除的資源名稱'; COMMENT ON COLUMN public.gh_realtime_data.ref_type IS '建立/刪除的資源類型'; COMMENT ON COLUMN public.gh_realtime_data.state IS 'issue/pull_request/pull_request_review的狀態'; COMMENT ON COLUMN public.gh_realtime_data.author_association IS 'actor與repo之間的關係'; COMMENT ON COLUMN public.gh_realtime_data.language IS '程式設計語言'; COMMENT ON COLUMN public.gh_realtime_data.merged IS '是否接受合并'; COMMENT ON COLUMN public.gh_realtime_data.merged_at IS '代碼合并時間'; COMMENT ON COLUMN public.gh_realtime_data.additions IS '代碼增加行數'; COMMENT ON COLUMN public.gh_realtime_data.deletions IS '代碼減少行數'; COMMENT ON COLUMN public.gh_realtime_data.changed_files IS 'pull request 改變檔案數量'; COMMENT ON COLUMN public.gh_realtime_data.push_size IS '提交數量'; COMMENT ON COLUMN public.gh_realtime_data.push_distinct_size IS '不同的提交數量'; COMMENT ON COLUMN public.gh_realtime_data.hr IS '事件發生所在小時,如00點23分,hr=00'; COMMENT ON COLUMN public.gh_realtime_data.month IS '事件發生所在月,如2015年10月,month=2015-10'; COMMENT ON COLUMN public.gh_realtime_data.year IS '事件發生所在年,如2015年,year=2015'; COMMENT ON COLUMN public.gh_realtime_data.ds IS '事件發生所在日,ds=yyyy-mm-dd'; COMMIT;建立Dynamic Table邏輯分區表。
CREATE DYNAMIC TABLE ads_dt_github_event LOGICAL PARTITION BY LIST(ds) WITH ( -- dynamic table的屬性 freshness = '5 minutes', auto_refresh_mode = 'auto', auto_refresh_partition_active_time = '2 days' , partition_key_time_format = 'YYYY-MM-DD' ) AS SELECT repo_name, COUNT(*) AS events, ds FROM gh_realtime_data GROUP BY repo_name,ds查詢Dynamic Table。
SELECT * FROM ads_dt_github_event ;回刷歷史分區。
如果基表有歷史資料變更,例如2025-04-01的資料有變更,Dynamic Table的資料需要同步更新,可以將Dynamic Table的歷史分區設定成全量重新整理模式,並結合Serverless執行一次重新整理。
REFRESH OVERWRITE DYNAMIC TABLE ads_dt_github_event PARTITION (ds = '2025-04-01') WITH ( refresh_mode = 'full' );
樣本5:通過Dynamic Table增量重新整理計算任意長周期UV計算
從Hologres V3.1版本開始,Dynamic Table增量重新整理支援RB_BUILD_AGG函數,以實現任意長周期的UV等計算,相比原預彙總方案,增量重新整理的優勢在於:
更快的效能:每次計算時只需要計算增量的資料,計算效能更快。
更低的成本:參與計算的資料量減少,使用的計算資源也隨之減少,有效降低成本。可以支援更長周期的資料量計算。
樣本如下:
準備一張使用者明細表。
BEGIN; CREATE TABLE IF NOT EXISTS ods_app_detail ( uid INT, country TEXT, prov TEXT, city TEXT, channel TEXT, operator TEXT, brand TEXT, ip TEXT, click_time TEXT, year TEXT, month TEXT, day TEXT, ymd TEXT NOT NULL ); CALL set_table_property('ods_app_detail', 'orientation', 'column'); CALL set_table_property('ods_app_detail', 'bitmap_columns', 'country,prov,city,channel,operator,brand,ip,click_time, year, month, day, ymd'); --distribution_key根據需求設定,根據該表的即時查詢需求,從什麼維度做分區能夠取得較好效果即可 CALL set_table_property('ods_app_detail', 'distribution_key', 'uid'); --用於做where過濾條件,包含完整年月日時間欄位推薦設為clustering_key和event_time_column CALL set_table_property('ods_app_detail', 'clustering_key', 'ymd'); CALL set_table_property('ods_app_detail', 'event_time_column', 'ymd'); COMMIT;通過Dynamic Table增量重新整理計算UV。
CREATE DYNAMIC TABLE ads_uv_dt WITH ( freshness = '5 minutes', auto_refresh_mode = 'incremental') AS SELECT RB_BUILD_AGG(uid), country, prov, city, ymd, COUNT(1) FROM ods_app_detail WHERE ymd >= '20231201' AND ymd <='20240502' GROUP BY country,prov,city,ymd;查詢任意周期的UV。
SELECT RB_CARDINALITY(RB_OR_AGG(rb_uid)) AS uv, country, prov, city, SUM(pv) AS pv FROM ads_uv_dt WHERE ymd = '20240329' GROUP BY country,prov,city;
V3.0版本
樣本1:建立全量重新整理Dynamic Table並自動開始執行重新整理
執行下述操作前,請先參考一鍵匯入公用資料集將tpch_10g公用資料集的資料匯入至Hologres。
--建立 “test” Schema
CREATE SCHEMA test;
--建立單表全量重新整理的dynamic table,並立即開始重新整理,每1小時重新整理一次。
CREATE DYNAMIC TABLE test.thch_q1_full
WITH (
refresh_mode='full',
auto_refresh_enable='true',
full_auto_refresh_interval='1 hours',
full_guc_hg_computing_resource='serverless',
full_guc_hg_experimental_serverless_computing_required_cores='32'
)
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_10g.lineitem
WHERE
l_shipdate <= DATE '1998-12-01' - INTERVAL '120' DAY
GROUP BY
l_returnflag,
l_linestatus;樣本2:建立增量重新整理的Dynamic Table並指定開始重新整理時間
執行下述操作前,請先參考一鍵匯入公用資料集將tpch_10g公用資料集的資料匯入至Hologres。
建立增量Dynamic Table樣本如下:
在建立增量Dynamic Table之前,需要為基表開啟Binlog(維表不需要開啟)。
--為基表開binlog:
BEGIN;
CALL set_table_property('hologres_dataset_tpch_10g.lineitem', 'binlog.level', 'replica');
COMMIT;
--建立單表增量重新整理的dynamic table,並指定開始重新整理時間,每3min重新整理一次
CREATE DYNAMIC TABLE public.tpch_q1_incremental
WITH (
refresh_mode='incremental',
auto_refresh_enable='true',
incremental_auto_refresh_schd_start_time='2024-09-15 23:50:0',
incremental_auto_refresh_interval='3 minutes',
incremental_guc_hg_computing_resource='serverless',
incremental_guc_hg_experimental_serverless_computing_required_cores='30'
) AS SELECT
l_returnflag,
l_linestatus,
COUNT(*) AS count_order
FROM
hologres_dataset_tpch_10g.lineitem
WHERE
l_shipdate <= DATE '1998-12-01' - INTERVAL '120' DAY
GROUP BY
l_returnflag,
l_linestatus
;樣本3:建立多表JOIN的全量重新整理Dynamic Table
--建立query為多表join的dynamic table,全量重新整理模式,每3小時重新整理一次。
CREATE DYNAMIC TABLE dt_q_full
WITH (
refresh_mode='full',
auto_refresh_enable='true',
full_auto_refresh_schd_start_time='immediate',
full_auto_refresh_interval='3 hours',
full_guc_hg_computing_resource='serverless',
full_guc_hg_experimental_serverless_computing_required_cores='64'
)
AS
SELECT
o_orderpriority,
COUNT(*) AS order_count
FROM
hologres_dataset_tpch_10g.orders
WHERE
o_orderdate >= DATE '1996-07-01'
AND o_orderdate < DATE '1996-07-01' + INTERVAL '3' MONTH
AND EXISTS (
SELECT
*
FROM
hologres_dataset_tpch_10g.lineitem
WHERE
l_orderkey = o_orderkey
AND l_commitdate < l_receiptdate
)
GROUP BY
o_orderpriority;樣本4:建立維表JOIN的增量重新整理Dynamic Table
建立維表JOIN的增量Dynamic Table樣本如下:
在建立增量Dynamic Table之前,需要為基表開啟Binlog(維表不需要開啟)。
維表JOIN的語義是:對每條資料,只會關聯當時維表的最新版本資料,即JOIN行為只發生在處理時間(Processing Time)。如果JOIN行為發生後,維表中的資料發生了變化(新增、更新或刪除),則已關聯的維表資料不會被同步變化。SQL樣本如下:
--明細表
BEGIN;
CREATE TABLE public.sale_detail(
app_id TEXT,
uid TEXT,
product TEXT,
gmv BIGINT,
order_time TIMESTAMPTZ
);
--為基表開binlog,維表不需要開啟
CALL set_table_property('public.sale_detail', 'binlog.level', 'replica');
COMMIT;
--屬性工作表
CREATE TABLE public.user_info(
uid TEXT,
province TEXT,
city TEXT
);
CREATE DYNAMIC TABLE public.dt_sales_incremental
WITH (
refresh_mode='incremental',
auto_refresh_enable='true',
incremental_auto_refresh_schd_start_time='2024-09-15 00:00:00',
incremental_auto_refresh_interval='5 minutes',
incremental_guc_hg_computing_resource='serverless',
incremental_guc_hg_experimental_serverless_computing_required_cores='128')
AS
SELECT
sale_detail.app_id,
sale_detail.uid,
product,
SUM(sale_detail.gmv) AS sum_gmv,
sale_detail.order_time,
user_info.province,
user_info.city
FROM public.sale_detail
INNER JOIN public.user_info FOR SYSTEM_TIME AS OF PROCTIME()
ON sale_detail.uid =user_info.uid
GROUP BY sale_detail.app_id,sale_detail.uid,sale_detail.product,sale_detail.order_time,user_info.province,user_info.city;樣本5:建立分區Dynamic Table
以即時交易大屏為例,業務通常會有近即時查看當天資料,同時又需要修正歷史資料的需求。在這種情境下,我們通常使用Dynamic Table增量重新整理和全量重新整理來實現。做法如下:
建立分區表作為基表,最新分區採用即時/近即時寫入方式,歷史分區偶爾有資料修正的操作。
建立Dynamic Table,將其作為分區父表,最新的分區使用增量重新整理模式,滿足業務的近即時資料分析需求。
將歷史分區切換成全量重新整理模式,如果源錶的歷史分區進行過資料修正/回刷,則Dynamic Table的歷史分區也可以使用全量重新整理模式進行一次回刷,同時建議結合Serverless提升回刷速度。
樣本如下:
準備基表和資料。
基表為分區表,最新分區採用即時資料寫入方式。
-- 建立分區源表 CREATE TABLE base_sales( uid INT, opreate_time TIMESTAMPTZ, amount FLOAT, tt TEXT NOT NULL, ds TEXT, PRIMARY KEY(ds) ) PARTITION BY LIST (ds) ; --歷史分區 CREATE TABLE base_sales_20240615 PARTITION OF base_sales FOR VALUES IN ('20240615'); INSERT INTO base_sales_20240615 VALUES (2,'2024-06-15 16:18:25.387466+08','111','2','20240615'); --最新分區,一般是即時寫入 CREATE TABLE base_sales_20240616 PARTITION OF base_sales FOR VALUES IN ('20240616'); INSERT INTO base_sales_20240616 VALUES (1,'2024-06-16 16:08:25.387466+08','2','1','20240616');建立Dynamic Table分區父表,父表只設定Query的定義,不設定重新整理模式。
--建立extension CREATE EXTENSION roaringbitmap; CREATE DYNAMIC TABLE partition_dt_base_sales PARTITION BY LIST (ds) as SELECT public.RB_BUILD_AGG(uid), opreate_time, amount, tt, ds, COUNT(1) FROM base_sales GROUP BY opreate_time ,amount,tt,ds;建立子表,並為子表設定重新整理模式。
您可手動建立Dynamic Table分區子表,也可以使用DataWorks資料開發動態建立Dynamic Table分區子表。最新分區建立為增量重新整理模式,歷史分區設定為全量重新整理模式。
-- 為基表開啟Binlog ALTER TABLE base_sales SET (binlog_level = replica); -- 假設歷史Dynamic Table分區子表如下: CREATE DYNAMIC TABLE partition_dt_base_sales_20240615 PARTITION OF partition_dt_base_sales FOR VALUES IN ('20240615') WITH ( refresh_mode='incremental', auto_refresh_enable='true', incremental_auto_refresh_schd_start_time='immediate', incremental_auto_refresh_interval='30 minutes' ); -- 建立新的Dynamic Table分區子表,並指定最新分區的重新整理模式為增量重新整理,建表成功後立即開始啟動重新整理,重新整理間隔為30分鐘,並使用本執行個體資源重新整理。 CREATE DYNAMIC TABLE partition_dt_base_sales_20240616 PARTITION OF partition_dt_base_sales FOR VALUES IN ('20240616') WITH ( refresh_mode='incremental', auto_refresh_enable='true', incremental_auto_refresh_schd_start_time='immediate', incremental_auto_refresh_interval='30 minutes' ); --將歷史分區轉換為全量重新整理模式 ALTER DYNAMIC TABLE partition_dt_base_sales_20240615 SET (refresh_mode = 'full'); --如果歷史分區需要資料訂正,可以執行一次refresh,建議配合serverless來執行。 SET hg_computing_resource = 'serverless'; REFRESH DYNAMIC TABLE partition_dt_base_sales_20240615;
文法轉換命令
Hologres 自V3.1版本開始,Dynamic Table的文法有所升級。當您從V3.0版本升級後,需要使用V3.1文法重建立表,Hologres提供文法轉換工具,方便您更加簡便的完成文法轉換。
需重建立表情境
增量重新整理的Dynamic Table:若是Dynamic Table是增量重新整理,則必須重新建立。
升級檢查中文法不相容,必須重建立表,具體情況需以升級檢查報告為準。
通過V3.0文法建立的Dynamic Table除以上情境外,可以不需要重新建立,但只能對錶執行ALTER,不能使用V3.0版本文法建表。
轉換文法命令的適用情境
僅適用於非分區表(重新整理模式包含增量重新整理和全量重新整理),如果您在V3.0版本是Dynamic Table分區表,需要手動重建,並建議您使用Dynamic Table邏輯分區。
查看需要轉換的表
通過如下命令可以查看當前執行個體中升級後需要轉換的表:
非分區表
SELECT DISTINCT
p.dynamic_table_namespace as table_namespace,
p.dynamic_table_name as table_name
FROM hologres.hg_dynamic_table_properties p
JOIN pg_class c ON c.relname = p.dynamic_table_name
JOIN pg_namespace n ON n.oid = c.relnamespace AND n.nspname = p.dynamic_table_namespace
WHERE p.property_key = 'refresh_mode'
AND p.property_value = 'incremental'
AND c.relispartition = false
AND c.relkind != 'p';分區表
SELECT DISTINCT
pn.nspname as parent_schema,
pc.relname as parent_name
FROM hologres.hg_dynamic_table_properties p
JOIN pg_class c ON c.relname = p.dynamic_table_name
JOIN pg_namespace n ON n.oid = c.relnamespace AND n.nspname = p.dynamic_table_namespace
JOIN pg_inherits i ON c.oid = i.inhrelid
JOIN pg_class pc ON pc.oid = i.inhparent
JOIN pg_namespace pn ON pn.oid = pc.relnamespace
WHERE p.property_key = 'refresh_mode'
AND p.property_value = 'incremental'
AND c.relispartition = true
AND c.relkind != 'p';轉換文法命令的使用
在使用轉換文法命令需注意以下情況:
僅Hologres V3.1.11及以上版本支援該命令文法。
需要Superuser執行該命令。
執行完成後,將會有如下行為變更:
如果表開啟了自動重新整理,將會立即啟動自動重新整理,建議在業務低峰期執行,避免任務同一時間啟動相互搶佔資源,同時也建議使serverless執行重新整理,可以更好的將重新整理任務隔離。
資源使用的變更:
使用3.1版本新文法(3.1版本和3.2版本),對於計算群組型執行個體,使用的warehouse資源為base表所在TG的leader warehouse以及Dynamic Table表所在TG的leader Warehouse資源。
使用老版本文法(3.0版本)或者執行個體是4.1版本使用新文法,對於計算群組型執行個體,使用的warehouse資源為Dynamic Table所在的TG的leader warehouse。
串連數的變更:新文法將會使用更加穩定和高效的底層調度能力,每個Dynamic Table將會多一個串連,如果執行個體的串連數使用率較高,且執行個體中dynamic table數量比較多(幾百張),建議先適當清理空閑串連。
轉換文法的命令如下:
--僅適用於非分區表(重新整理模式包含全量重新整理和增量重新整理),分區表請手動重新建立,並建議使用邏輯分區。
--單個錶轉換
call hg_dynamic_table_config_upgrade('<table_name>');
--批量轉換所有表,請謹慎使用。
call hg_upgrade_all_normal_dynamic_tables();該方式會將當前資料庫下所有V3.0版本的Dynamic Table分區錶轉換為V3.1版本。
文法參數映射
使用文法轉換命令,V3.0版本和V3.1版本的參數以及對應的值對應如下:
V3.0版本參數名 | V3.1版本參數名 | 說明 |
refresh_mode | auto_refresh_mode | 轉換後與轉換前參數值保持一致。例如:轉換前配置為 |
auto_refresh_enable | auto_refresh_enable | 參數值保持一致。 |
{refresh_mode}_auto_refresh_schd_start_time | freshness | auto_refresh_interval的值將會為轉換為freshness的值。 例如:轉換前配置為 |
{refresh_mode}_auto_refresh_interval | ||
{refresh_mode}_guc_hg_computing_resource | computing_resource | 轉換後與轉換前參數值保持一致。例如:轉換前配置為 |
{refresh_mode}_guc_hg_experimental_serverless_computing_required_cores | refresh_guc_hg_experimental_serverless_computing_required_cores | 轉換後與轉換前參數值保持一致。 |
{refresh_mode}_guc_<guc> | refresh_guc_<guc_name> | 轉換後與轉換前參數值保持一致。例如:轉換前配置為
|
orientation等表屬性 | orientation等表屬性 | 表的基本屬性都會保持不變。 |
下一步:管理Dynamic Table
Dynamic Table建立成功後,您可以執行如下操作:
查看Dynamic Table DDL、血緣關係等。詳情請參見查看Dynamic Table表結構和血緣。
修改Dynamic Table相關屬性,詳情請參見ALTER DYNAMIC TABLE。
常見問題
問題現象:Segment Key/Clustering Key為空白報錯。報錯樣本如下:
ERROR: commit ddl phase1 failed: the index partition key "xxx" should not be nullable問題原因:Dynamic Table的Segment Key/Clustering是個允許非空值的列。Segment Key和Clustering Key的設定規則詳情,請參見Event Time Column(Segment Key)。
解決方案:
如果報錯的欄位為Clustering Key,則在Hologres V3.1.26、V3.2.9、V4.0.0及之後的版本中所建立的增量重新整理表將不會出現報錯。而在這些版本之前建立的表,請務必先升級執行個體版本,然後執行如下GUC,以修改表屬性,允許Clustering Key 為空白。
--3.1及以上版本文法,允許segment key為nullable ALTER DYNAMIC TABLE [ IF EXISTS ] [<schema>.]<table_name> SET (refresh_guc_hg_experimental_enable_nullable_segment_key=true);若報錯的欄位為Segment Key,可以對錶執行以下GUC,以修改表屬性,允許Segment Key 為空白。同時,從 Hologres V4.1 版本起,將允許 Segment Key 為空白,建議進行版本升級。
--3.1及以上版本文法,clustering key為nullable ALTER DYNAMIC TABLE [ IF EXISTS ] [<schema>.]<table_name> SET (refresh_guc_hg_experimental_enable_nullable_clustering_key=true);