增量刷新物化視圖
增量刷新會通過特定算法,只計算變更部分的數據,然后定向更新物化視圖中的數據。增量刷新相較于全量刷新開銷更低,可以更高頻地更新。如果您僅需要刷新變更的數據,可以選擇增量刷新物化視圖。本文介紹如何在創建物化視圖時指定增量刷新模式。
前提條件
增量刷新物化視圖時,集群內核版本應滿足以下條件:
增量刷新單表物化視圖時,集群的內核版本需為3.1.9.0及以上版本。
增量刷新多表物化視圖時,集群的內核版本需為3.2.1.0及以上版本。
查看企業版、基礎版或湖倉版集群的內核版本,請執行
SELECT adb_version();
。如需升級內核版本,請聯系技術支持。查看和升級數倉版集群的內核版本,請參見查看和升級版本。
適用場景
物化視圖常用來加速復雜查詢或者簡化ETL流程,物化視圖的本質是將用戶定義的查詢提前計算好,按用戶要求自動刷新視圖中的數據。刷新的方式一般分為兩種,全量刷新和增量刷新。兩者區別如下:
全量刷新每次重新運行SQL,將算好的新數據全量覆蓋舊數據。
增量刷新通過特定算法,每次只計算新變更部分的數據,然后定向更新物化視圖中的部分數據。
因此,增量刷新往往開銷更低,可以更高頻地更新。從更新機制上看,增量刷新是優于全量刷新的,但其實并不是所有場景都適合增量刷新。它們各自有適用的場景。
全量刷新適用于T+1類的離線場景。常見的適用場景如下:
數據每天批量更新一次,或者小時級別更新一次,更適合全量刷新。這類SQL通常比較復雜,全量刷新對SQL語法沒有任何約束。
在某些分鐘級別延遲的場景中也可以使用全量刷新,往往這類SQL即使全量計算成本也不大,通常十幾秒能完成,還可以達到一定的實時效果。
增量刷新適用于實時場景。常見的適用場景如下:
數據實時流入。
需要實時更新的報表或ETL。
對數據延遲要求高的秒級延遲需求。
物化視圖本質是過去某一時刻的數據查詢結果,刷新的延遲越低,就越接近實際結果。一些數倉會保證強一致,但維護成本高,基表寫入性能也不穩定。AnalyticDB for MySQL是全異步算法,支持任意DML,不影響基表寫入。
增量更新成本更低,是勝在只算增量。如果計算相同的數據量,由于算法更復雜,計算成本要比全量刷新高。所以在T+1類定期大批數據量計算的場景,并不合適。并且要能夠維護查詢數據的增量更新,并不是任意SQL都支持的,有一些限制。
增量刷新可以代替一部分流計算的需求,尤其是對SQL查詢語意有要求的(要求增量刷新物化視圖的結果和查詢基表的結果完全一致),使用增量刷新不需要您額外維護流引擎組件,成本更低。
使用限制
增量刷新只支持自動刷新,不允許手動刷新。增量刷新模式下的自動刷新間隔最短5秒(s),最長5分鐘(min)。
由于物化視圖要保證結果和您查詢基表的結果完全一致,且要支持任意DML變更,所以并不是所有QUERY BODY都可以增量刷新。如果創建的物化視圖無法增量刷新,創建時會報錯。
內核版本為3.2.3.0以下的集群,不支持將定義了分區的表作為增量物化視圖的基表。
增量刷新的物化視圖,其基表在執行INSERT OVERWRITE以及TRUNCATE操作時會報錯,因此基表禁止執行這些操作。
增量刷新多表物化視圖時,您還需注意以下內容:
多表物化視圖目前僅支持使用INNER JOIN。
多表物化視圖中默認最多關聯5張表,若您有需求,可提交工單聯系技術支持,根據集群規格調大該限制。
多表物化視圖中的關聯字段需為表的原始字段,且關聯字段的數據類型相同,均有INDEX索引。
基表為復制表時,不支持增量刷新多表物化視圖。
權限要求
創建物化視圖需要有數據庫或表級別的CREATE權限。
刷新物化視圖需要有數據庫或表級別的INSERT權限。
需要有物化視圖所涉及的所有表的相關列(或整個表)的SELECT權限。
如果在創建物化視圖時指定物化視圖為自動刷新模式,需要具備通過服務器本地(即
127.0.0.1
)或者任意IP(即'%'
)刷新視圖的權限。如果在創建物化視圖時指定物化視圖為增量刷新模式,需要有物化視圖所涉及的所有基表的ALTER權限。
準備工作
在創建增量刷新的物化視圖前,需要執行以下操作:
打開Binlog特性。
重要3.2.0.0及以上內核版本集群默認打開Binlog特性;3.2.0.0以下內核版本集群需執行
SET
命令手動打開Binlog特性。查看企業版、基礎版或湖倉版集群的內核版本,請執行
SELECT adb_version();
。如需升級內核版本,請聯系技術支持。查看和升級數倉版集群的內核版本,請參見查看和升級版本。
SET ADB_CONFIG BINLOG_ENABLE=true;
打開基表的Binlog功能。
ALTER TABLE <table_name> binlog=true;
重要對于打開Binlog功能的表,只有3.2.0.0及以上內核版本才支持INSERT OVERWRITE INTO和TRUNCATE操作。
增量刷新物化視圖創建完成后,不允許關閉基表的Binlog功能。
刪除增量刷新的物化視圖后,可以執行
SET ADB_CONFIG BINLOG_ENABLE=false;
和ALTER TABLE <table_name> binlog=false;
手動關閉Binlog特性和基表的Binlog功能。
創建物化視圖時指定增量刷新模式
CREATE [OR REPLACE] MATERIALIZED VIEW <mv_name>
[MV DEFINITION]
REFRESH FAST [ON DEMAND] [START WITH date] <NEXT date>
AS
<QUERY BODY>
關鍵字說明
關鍵字 | 是否必填 | 說明 |
| 否 | 根據是否存在重名物化視圖選擇對應的規則來創建物化視圖,具體規則如下:
|
| 是 | 物化視圖名稱。 |
| 否 | 定義物化視圖中表相關的特性。物化視圖使用一張普通的表結構來存儲數據,您可以使用該關鍵字指定物化視圖的主鍵,分區鍵,索引等。 增量刷新的物化視圖會自動生成主鍵。您也可以手動指定主鍵,主鍵生成的規則如下:
說明 與創建表的語法一致,創建物化視圖時也不支持定義查詢中沒有輸出的列。 |
| 是 | 指定刷新模式為增量刷新。 |
| 否 | 按需觸發刷新。增量刷新僅支持根據配置的 |
| 否 | 定義自動刷新物化視圖時的首次刷新時間。若不填,默認首次刷新時間為當前時間點。 |
| 是 | 定義自動刷新物化視圖時的下次刷新時間。 |
| 是 | 定義物化視圖的查詢主體。
|
增量刷新單表物化視圖
創建基表。
CREATE TABLE tbl0 (a bigint, b tinyint, c boolean, d decimal(15, 2), PRIMARY KEY(a)) DISTRIBUTED BY HASH (a);
打開Binlog特性。
SET ADB_CONFIG BINLOG_ENABLE=true;
ALTER TABLE tbl0 binlog=true;
創建增量刷新的物化視圖。
創建無聚合操作的單表增量刷新的物化視圖,每10秒鐘刷新一次,示例如下:
CREATE MATERIALIZED VIEW mv0 REFRESH FAST NEXT now() + INTERVAL 10 second AS SELECT a, b, c #系統自動輸出基表主鍵作為物化視圖主鍵。 FROM tbl0 WHERE d > 1000;
創建分組聚合操作的單表增量刷新的物化視圖,每5秒鐘刷新一次,示例如下:
CREATE MATERIALIZED VIEW mv1 REFRESH FAST NEXT now() + INTERVAL 5 second AS SELECT b, c, # 系統會自動輸出GROUP BY列作為物化視圖主鍵。 COUNT(a) AS cnt_a, # 聚合輸出列。 sum(d) AS sum_d, # 聚合輸出列。 b / 100 AS new_b # 非聚合輸出列可以使用任意表達式。 FROM tbl0 WHERE ifnull(d, 1) > 0 # 條件可以使用任何表達式。 GROUP BY b, c;
創建無分組聚合操作的單表增量物化視圖,每分鐘刷新一次,示例如下:
CREATE MATERIALIZED VIEW mv2 REFRESH FAST NEXT now() + INTERVAL 1 minute AS SELECT count(*) AS cnt # 系統會自動生成常量主鍵,確保全局只有一條記錄在視圖中。 FROM tbl0;
增量刷新多表物化視圖
創建基表,并打開Binlog特性。
CREATE TABLE tbl0 ( a0 bigint, b0 varchar, c0 int, d0 varchar, e0 boolean, PRIMARY KEY(a0) ) DISTRIBUTED BY HASH (a0) BINLOG=true; CREATE TABLE tbl1 ( a1 bigint, b1 varchar, c1 int, d1 varchar, e1 boolean, PRIMARY KEY(a1) ) DISTRIBUTED BY HASH (a1) BINLOG=true; CREATE TABLE tbl2 ( a2 bigint, b2 varchar, c2 int, d2 varchar, e2 boolean, PRIMARY KEY(a2) ) DISTRIBUTED BY HASH (a2) BINLOG=true;
創建增量刷新的物化視圖。
創建無聚合操作的多表增量刷新的物化視圖,每5秒鐘刷新一次,示例如下:
CREATE MATERIALIZED VIEW mv3 REFRESH FAST NEXT now() + INTERVAL 5 second AS SELECT a0, a1, a2, (c0 + c1 + c2) AS c FROM tbl0 JOIN tbl1 ON b1 = b0 JOIN tbl2 ON b2 = b1;
創建分組聚合操作的多表增量刷新的物化視圖,每10秒鐘刷新一次,示例如下:
CREATE MATERIALIZED VIEW mv4 REFRESH FAST NEXT now() + INTERVAL 10 second AS SELECT d0, d1, d2, COUNT(*) AS cnt, sum(c1) AS sum_c1, sum(c2) AS sum_c2 FROM tbl0 JOIN (SELECT b1, c1, d1 FROM tbl1) ON b1 = b0 JOIN (SELECT * FROM tbl2 WHERE e2 = true) ON b2 = b1 GROUP BY d0, d1, d2;