Dynamic Table支援修改部分屬性。本文為您介紹ALTER DYNAMIC TABLE的用法。
修改重新整理任務
暫停重新整理任務
設定暫停後,此表後續所有的重新整理任務都會停止運行。
-- auto_refresh_enable:是否開啟自動重新整理。false:暫停不開啟。
ALTER DYNAMIC TABLE [IF EXISTS] [<schema_name>.]<table_name> SET (auto_refresh_enable = false);重新啟動重新整理任務
對於已暫停表重新整理任務,支援重新啟動。啟動後,將沿用原有表的重新整理設定,重新執行重新整理任務。
-- auto_refresh_enable:是否開啟自動重新整理。true:開啟。
ALTER DYNAMIC TABLE [IF EXISTS] [<schema_name>.]<table_name> SET (auto_refresh_enable = true);修改重新整理的freshness時間
支援修改freshness的時間,最小值為1 minute,修改後立即生效。
僅使用V3.1版本文法建立的Dynamic Table支援該參數。
ALTER DYNAMIC TABLE [ IF EXISTS ] [<schema_name>.]<table_name> SET (freshness='<num> {minutes | hours}');修改重新整理計算資源和規格
支援修改重新整理的計算資源,可以選擇本執行個體資源(local)或者Serverless資源(serverless)。如果是Serverless資源,支援修改計算規格。您可根據業務情況適當地調大或調小重新整理的規格,但執行個體能使用的規格有一定的限制,詳情請參見Serverless Computing使用指南。
僅4.0.7及以上版本支援顯示填寫warehouse_name
V4.0.7及以上版本
--修改refresh的計算資源,可以選擇為本地執行或者serverless執行
ALTER [DYNAMIC] TABLE [ IF EXISTS ] [<schema>.]<table_name> SET (['local' | 'serverless' | '<warehouse_name>'])
--修改serverless的計算資源規格
ALTER DYNAMIC TABLE [ IF EXISTS ] [<schema>.]<table_name> SET (auto_refresh_guc_hg_experimental_serverless_computing_required_cores='<num>')V3.1版本
--修改refresh的計算資源,可以選擇為本地執行或者serverless執行
ALTER DYNAMIC TABLE [ IF EXISTS ] [<schema_name>.]<table_name>
SET (computing_resource ='[local|serverless]');
--修改serverless的計算資源規格
ALTER DYNAMIC TABLE [ IF EXISTS ] [<schema_name>.]<table_name>
SET (refresh_guc_hg_experimental_serverless_computing_required_cores='<num>');V3.0版本
--修改單個表的refresh資源
ALTER DYNAMIC TABLE [ IF EXISTS ] [<schema_name>.]<table_name>
SET (<incremental/full>_guc_hg_computing_resource ='[local|serverless]');
--如果是serverless模式,還可以修改serverless的計算規格
ALTER DYNAMIC TABLE [ IF EXISTS ] [<schema_name>.]<table_name>
SET (<incremental/full>_guc_hg_experimental_serverless_computing_required_cores='<num>');修改重新整理模式
從V3.1版本開始,修改重新整理模式支援更多選項,包括:
增量重新整理修改為全量重新整理(V3.0及以上版本均支援)。
自動重新整理修改為全量重新整理(V3.1及以上版本支援)。
修改為全量重新整理模式後,會將原有的增量重新整理任務停止,請根據業務需要,重新設定重新整理任務相關屬性。
系統會自動將增量重新整理的狀態表清理掉,減少儲存佔用。
邏輯分區Dynamic Table修改後,僅對未來的分區生效;非分區Dynamic Table修改後立即生效。
V3.1版本文法
ALTER DYNAMIC TABLE <schema_name>.<table_name> SET (auto_refresh_mode = '<full/auto>');V3.0版本文法
ALTER DYNAMIC TABLE <schema_name>.<table_name> SET (refresh_mode = 'full');修改活躍分區時間範圍
當Dynamic Table是邏輯分區表時,支援修改活躍分區的時間範圍,以此來調整自動重新整理的分區範圍。
僅V3.1及以上版本支援。
調整後只對未來建立的分區生效,已有分區不受影響。
-- auto_refresh_partition_active_time:自動重新整理的時間範圍。修改後只對未來分區生效。
ALTER DYNAMIC TABLE [IF EXISTS] [<schema_name>.]<table_name> SET (auto_refresh_partition_active_time = '<num> {minutes | hours | days}');修改Query定義和加列
V3.1版本文法
Hologres自V3.1.18版本開始,Dynamic Table支援修改Query定義,以及在Query中加列實現給Dynamic Table加列。
ALTER DYNAMIC TABLE [ IF EXISTS ] [<schema_name>.]<table_name>
AS
<query>; -- 新的query的定義使用說明:
對於新Query定義的要求如下:
新的Query產生的Dynamic Table必須和原Query產生的Dynamic Table表結構相容,包括:
都是分區表或者都是非分區表。
表的PK相同。
表的Distribution Key相同,且不允許修改Distribution Key。
表的Partition Key相同,且不允許修改Partition Key。
表的Clustering Key、Segment Key、表的儲存模式(列存、行列共存等)、Dictionary Encoding、Bitmap Index相同。
欄位名必須相同,且不能修改欄位名。
同名的欄位、資料類型相同,NULLABLE屬性相同。
只能在Query中ADD Column,不支援DROP Column。新增列,已有資料保持不變,新增的列預設補NULL值,會在下一次Refresh後更新資料。
修改Query定義後,Refresh的行為如下:
非分區Dynamic Table:下一次Refresh時(無論是Auto Refresh還是手動Refresh)會支援Refresh Overwrite。
邏輯分區Dynamic Table:活躍分區在下一次Auto Refresh會自動觸發Refresh Overwrite;歷史分區需要手動觸發一次Refresh。
修改Query定義後,如果Query中有增量重新整理不支援的運算元,此時Refresh的行為如下:
重新整理模式
新Query定義支援增量重新整理
新Query定義不支援增量重新整理
auto_refresh_mode = 'auto'
保持建表時指定的refresh_mode。
refresh_mode自動變為全量重新整理。
auto_refresh_mode = 'incremental'
保持增量重新整理。
重新整理報錯,需要手動改為全量重新整理。
auto_refresh_mode = 'full'
保持全量重新整理。
保持全量重新整理。
使用樣本
準備樣本資料。
--準備一張源表 CREATE TABLE employees ( department_id INT, employee_name VARCHAR ); --插入資料 INSERT INTO employees (department_id, employee_name) VALUES (1, 'John'), (1, 'Jane'), (1, 'John'), -- 重複值 (2, 'Alice'), (2, 'Bob'), (2, 'Alice'); -- 重複值 --建立一張dynamic table CREATE DYNAMIC TABLE dt_employees WITH ( -- dynamic table的屬性 freshness = '1 minutes', auto_refresh_mode = 'auto', distribution_key = 'department_id' ) AS SELECT department_id FROM employees GROUP BY department_id; --查詢dynamic table中的資料 SELECT * FROM dt_employees;對Dynamic Table新增一列。
--新增一列 ALTER DYNAMIC TABLE dt_employees AS SELECT department_id, STRING_AGG(DISTINCT employee_name, ', ') AS unique_employees FROM employees GROUP BY department_id;執行成功後查詢Dynamic Table的資料,可以看到新增的資料是NULL。
department_id |unique_employees -----------|-------- 1 |\N 2 |\N等到下一次Refresh成功後,可以看到新增的列資料已經重新整理完成。
department_id |unique_employees -------------|--------- 1 |Jane, John 2 | Bob, Alice
V3.0版本文法
Hologres V3.0支援修改Query定義,文法如下,目前僅支援全量模式修改,增量模式暫不支援。
修改Query定義後,只會修改表的Query定義,並不會修改原來的欄位名、欄位屬性等。
請謹慎執行修改Query定義,如果新Query的欄位與原欄位不一致,可能會導致Refresh報錯或資料不一致等問題。
ALTER DYNAMIC TABLE [IF EXISTS] [<schema>.]<table_name> SET (task_definition = $$<new_query>$$); 使用ALTER DYNAMIC TABLE語句更新動態表,若字串被半形單引號('')包裹,通過HG_DUMP_SCRIPT函數擷取動態表DDL與HoloWeb展示的DDL不一致。原因是PostgreSQL認為傳入的字串識別為Identifier,並通過TRUNCATE截斷至128字元導致。因此,建議將半形單引號('')替換為$$ XXX $$。
修改重新整理開始時間
修改重新整理的開始時間,只能修改為未來的指定時間。僅V3.0版本建立的Dynamic Table支援該文法。
--修改重新整理的開始時間full_auto_refresh_schd_start_time。
ALTER DYNAMIC TABLE [IF EXISTS] [<schema_name>.]<table_name> SET (<incremental/full>_auto_refresh_schd_start_time = '<timestamptz>');修改重新整理時間間隔
支援修改Dynamic Table的重新整理時間間隔。修改後的重新整理任務將會使用新設定的重新整理間隔執行。僅V3.0版本建立的Dynamic Table支援該文法。
--修改重新整理的時間間隔full_auto_refresh_interval,如三分鐘為'3 minutes'。
ALTER DYNAMIC TABLE [IF EXISTS] [<schema_name>.]<table_name> SET (<incremental/full>_auto_refresh_interval = '[<num> { minutes | hours}]');修改Dynamic Table表屬性
Dynamic Table支援修改以下表屬性,其他未提及的屬性暫不支援修改。詳情請參見ALTER TABLE。
從Hologres V3.1.20版本開始,支援ALTER DYNAMIC TABLE RENAME和ALTER DYNAMIC TABLE SET SCHEMA,Hologres V3.1.20以下版本支援ALTER TABLE RENAME和ALTER TABLE SET SCHEMA。
--重新命名表名,Hologres V3.1.20及以上版本支援ALTER DYNAMIC TABLE RENAME
ALTER DYNAMIC TABLE [IF EXISTS] <table_name> RENAME TO <new_name>;
--修改dictionary
ALTER DYNAMIC TABLE [<schema_name>].<table_name> SET (dictionary_encoding_columns = '[columnName{:[on|off|auto]}[,...]]');
--修改bitmap
ALTER DYNAMIC TABLE [<schema_name>].<table_name> SET (bitmap_columns = '[columnName{:[on|off]}[,...]]');
--修改TTL
ALTER DYNAMIC TABLE [<schema_name>].<table_name> SET (time_to_live_in_seconds = 'num');
--修改schema
ALTER DYNAMIC TABLE [IF EXISTS] [<schema_name>.]<table_name> SET SCHEMA <new_schema>;