全部產品
Search
文件中心

MaxCompute:動態物化視圖(Delta Live MV)(邀測)

更新時間:Aug 27, 2025

MaxCompute新推出動態物化視圖功能(Delta Live Materialized View),協助使用者構建簡單易用的累加式更新Pipeline。本文為您介紹MaxCompute動態物化視圖的相關操作。

功能介紹

動態物化視圖相比全量重新整理物化視圖,能夠平衡資料新鮮度和計算代價,充分利用存量的計算結果,通過智能的增量計算演算法,減少計算代價,並提高資料新鮮度。

該功能目前處於邀測中,邀測功能使用方法請參見使用說明

整體架構

image

優勢

MaxCompute的動態物化視圖Delta Live MV功能具備以下優勢:

  • 聲明式SQL、免營運、自動數倉分層。

  • 簡化數倉架構,一份計算邏輯,一個引擎,同時支援增量計算和全量計算,同時滿足低延遲和高吞吐需求。

  • 成本效益,平衡資料新鮮度和成本,高效處理增全量ETL。

適用情境

該功能適用於以下情境:

  • 離線業務即時化

    從T+1數倉演化到分鐘級近即時數倉。

  • 增全量一體

    • 當天分區近即時增量計算:業務資料新鮮度要求高,計算性價比高。

    • (可選操作)歷史分區回刷:資料歸檔、修正,用於後續大規模資料分析。

前提條件

  • 已在MaxCompute控制台建立專案。

  • 源表(source table)已開啟CDC功能。目前支援的源表類型如下:

注意事項

  • 動態物化視圖不能包含非確定性計算,如RAND函數、UDF等。

  • 當前動態物化視圖全面支援各種SQL邏輯的增量計算,包含以下常見的SQL運算元:

    • 雙流INNER JOIN

    • 雙流(LEFT/RIGHT)OUTER JOIN

    • 任意AGGREGATE(除UDAF外),包括無GROUP BY、無AGG的Function。

    • WINDOW

    • TableFunctionScan

    • UNION ALL

    • FILTER/Project

    • SUBQUERY

建立動態物化視圖

文法格式

CREATE MATERIALIZED VIEW [IF NOT EXISTS][<project_name>.]<mv_name>
[LIFECYCLE <days>]    --指定生命週期
[BUILD DEFERRED]    -- 指定是在建立時只產生表結構,不產生資料
[(<col_name> [COMMENT <col_comment>],...)]    --列注釋
[DISABLE REWRITE]    --指定是否用於改寫
[COMMENT <table comment>]    --表注釋
[PARTITIONED ON/BY (<col_name> [, <col_name>, ...])    --建立物化視圖表為分區表
[REFRESH EVERY <num> MINUTES/HOURS/DAYS] -- 設定物化視圖定時更新間隔
TBLPROPERTIES(
  "refresh_mode"="incremental"
  [,"enable_auto_refresh"="true"]    --指定是否開啟自動重新整理
  [,"refresh_cron"="xx"]             --根據cron定時器,可以配置定時間隔更新或者定點更新,間隔定點更新等
  [,"refresh_job_settings"="xx"]
              )
AS <select_statement>;

動態物化視圖Delta Live MV的文法相容主要普通物化視圖的文法,目前存在以下差異:

  • 當前不支援將動態物化視圖建立為聚簇表。

  • 動態物化視圖不支援將enable_auto_substitute參數設定為true。動態物化視圖是非同步物化視圖形態,所使用的base table資料不一定是最新版本,與enable_auto_substitute設定為true時衝突。

參數說明

參數

是否必填

描述

project_name

專案名稱。

mv_name

Delta Live MV名稱。

LIFECYCLE <days>

指定生命週期。

BUILD DEFERRED

指定在建立時只產生表結構,不產生資料。

col_name

列名。

col_comment

列注釋。

DISABLE REWRITE

指定是否用於改寫。

table comment

表注釋。

REFRESH EVERY <num> MINUTES/HOURS/DAYS

指定重新整理的調度間隔,最小值為1分鐘。

enable_auto_refresh

是否開啟自動重新整理。

  • true:開啟。

  • false:不開啟。

refresh_mode

重新整理模式。

  • full:全量重新整理。

  • incremental:增量重新整理。

refresh_cron

指定Cron運算式以設定重新整理頻率,可配置定時間隔更新、定點更新或間隔定點更新等。

取值為QUARTZ Cron格式的字串,使用詳情請參見Cron expression examples。樣本如下:

TBLPROPERTIES(
  "enable_auto_refresh"="true",
  "refresh_cron"="xx"
)

refresh_job_settings

設定通用的調優參數,重新整理時自動應用。樣本如下:

'refresh_job_settings'='set odps.sql.split.size=128;set odps.sql.reshuffle.dynamicpt
=false;'

select_statement

SQL查詢語句。

使用樣本

樣本1:建立簡單動態物化視圖

定義一個名為mv1的動態物化視圖,每5分鐘自動進行一次增量重新整理。其中source為一張開啟CDC功能的Delta Table。

CREATE MATERIALIZED VIEW IF NOT EXISTS mv1
REFRESH EVERY 5 MINUTES
TBLPROPERTIES("enable_auto_refresh"="true", "refresh_mode"="incremental")
AS 
SELECT name, COUNT(*) FROM source GROUP BY name;

樣本2:建立含通用調優參數的動態物化視圖

CREATE MATERIALIZED VIEW IF NOT EXISTS part_dlmv_department
PRIMARY KEY(dept_id)
LIFECYCLE 10
BUILD DEFERRED
PARTITIONED BY (pt)
TBLPROPERTIES('refresh_mode'='incremental', 
'refresh_job_settings'='set odps.sql.split.size=128;set odps.sql.reshuffle.dynamicpt
=false;')
AS SELECT *, get_setting('odps.custom.setting.department.pt') AS pt FROM t_department;

樣本3:建立單分區增量重新整理的動態物化視圖

建立分區動態物化視圖時,需添加BUILD DEFERRED關鍵字,表示僅執行DDL操作。

-- 建立動態物化視圖
CREATE MATERIALIZED VIEW dlmv_pt
PRIMARY KEY(value) BUILD DEFERRED PARTITIONED BY (ds) TBLPROPERTIES
('refresh_mode'='incremental', 'enable_auto_refresh'='true') 
AS SELECT value, AVG(value2), ds FROM dlmv_pt_src GROUP BY value, ds;

-- 重新整理單分區
ALTER MATERIALIZED VIEW dlmv_pt REBUILD PARTITION(ds='20250730');
說明

重新整理動態物化視圖的操作詳情,請參見手動重新整理

樣本4:建立包含參數化定義的動態物化視圖

支援參數化定義,可將離線分區作業遷移到增量作業。

  • 支援get_setting函數,用於擷取Session Flag中設定的參數值。需要以dps.custom.setting為首碼。

  • 傳統離線作業中的${biz_date}替換為get_setting(odps.custom.setting.xx),完成參數化改造。

  • 動態物化視圖重新整理語句前添加Session Flag set odps.custom.setting.xx=yy

  • 實際運行時,動態物化視圖中的get_setting(odps.custom.setting.xx)會被MaxCompute最佳化器自動替換為yy

樣本如下:

-- 建立動態物化視圖
CREATE MATERIALIZED VIEW mv1 
BUILD DEFERRED -- 只做ddl,不產生資料
PARTITIONED BY (ds) 
REFRESH EVERY 5 minutes 
TBLPROPERTIES("enable_auto_refresh"="true", "refresh_mode"="incremental")
AS 
SELECT A.* FROM A JOIN B ON A.c1 = B.c1
  AND A.ds=get_setting('odps.custom.setting.bizdate.a')
  AND B.ds=get_setting('odps.custom.setting.bizdate.b');

-- 重新整理邏輯,通過Dataworks調度,自動替換${biz_date}和${yesterday}
SET odps.custom.setting.bizdate.a=${biz_date};
SET odps.custom.setting.bizdate.b=${yesterday};
ALTER MATERIALIZED VIEW mv1 REBUILD PARTITION(ds=${biz_date});

管理動態物化視圖

刪除

DROP MATERIALIZED VIEW [IF EXISTS] [<project_name>.]<mv_name>;

手動重新整理

動態物化視圖提供手動重新整理能力,僅支援重新整理單分區。其文法和普通物化視圖相同:

ALTER MATERIALIZED VIEW [<project_name>.]<mv_name>
      REBUILD [PARTITION(<ds>=max_pt(<table_name>),<expression1>...)];

其中ds為分區列。

關閉自動重新整理

通過如下命令修改物化視圖的TBLPROPERTIES參數,以關閉自動重新整理功能。

ALTER MATERIALIZED VIEW <mv_name> SET TBLPROPERTIES("enable_auto_refresh"="false");

恢複自動重新整理

通過如下命令修改物化視圖的TBLPROPERTIES參數,以開啟或者恢複自動重新整理。

ALTER MATERIALIZED VIEW <mv_name> SET TBLPROPERTIES("enable_auto_refresh"="true");

修改重新整理頻率

通過如下命令修改動態物化視圖的重新整理頻率。

ALTER MATERIALIZED VIEW <mv_name> 
SET TBLPROPERTIES("refresh_interval_minutes"="xx");
說明

refresh_interval_minutes參數最小取值為1,建議該值小於base table的CDC生命週期。

查看動態物化視圖

查看資料變更歷史

通過如下命令查看動態物化視圖資料的變更記錄。

SHOW HISTORY FOR TABLE <mv_name>;

結果樣本:

ObjectType      ObjectId                                ObjectName              VERSION(LSN)            Time                    Operation
TABLE           d95ec7015e8b432e8e0092d01da962a9        incremental_mv          0000000000000001        2024-08-18 21:06:32     CREATE
TABLE           d95ec7015e8b432e8e0092d01da962a9        incremental_mv          0000000000000002        2024-08-18 21:11:13     UPDATE

查看重新整理記錄

通過如下命令查看動態物化視圖的重新整理記錄(僅針對Refresh操作)。

SELECT * FROM 
Delta_Live_MV_Refresh_History(['<project_name>', '<schema_name>',]'<table_name>');

參數說明

參數

描述

project_name

專案名稱。

schema_name

Schema名稱。

table_name

表名稱。

傳回值說明

欄位名稱

描述

project_name

Delta Live MV所屬的Project。

schema_name

Delta Live MV所屬的Schema。

name

Delta Live MV名稱。

refresh_start_time

重新整理開始時間。

refresh_end_time

重新整理結束時間。任務狀態為RUNNING時,該值為NULL。

instance_id

作業ID,通過ID可擷取Logview。

duration_in_seconds

重新整理耗時。

state

作業狀態。

  • RUNNING:運行中。

  • SUCCEEDED:運行成功。

  • FAILED:運行失敗。

  • CANCELLED:取消。

refresh_trigger

重新整理方式。

  • MANUAL:由使用者調用Refresh手動觸發重新整理,DataWorks調度對於MaxCompute也是手動觸發。

  • STSTEM_SCHEDULED:由MaxCompute內部調度重新整理。

refresh_mode

重新整理模式。

  • FULL:全量重新整理。

  • INCREMENTAL:增量重新整理。

  • NO_DATA:無增量資料。

error_message

重新整理失敗的資訊。若重新整理成功,則該值為NULL。

source_tables

記錄了Delta Live MV使用的基表名稱以及對應的版本。

numInsertedRows

INSERT行數。

numDeletedRows

DELETE行數。

計費規則

動態物化視圖包含計算和儲存兩部分費用。與普通物化視圖操作計算儲存計費方式一致。

  • 計算費用

    • 建立或重新整理動態物化視圖過程中,涉及到實際啟動作業計算的,會消耗計算資源產生計算費用,其計費規則和普通SQL作業一致。

    • 觸發自動重新整理功能時,若無實際增量資料變化,則不會啟動SQL作業進行重新整理操作,不產生費用。

    • 建議將動態物化視圖單獨放在某個Project中,方便跟蹤自動重新整理的作業及其計算資源消耗和費用。

  • 儲存費用

    • 動態物化視圖和普通物化視圖或者普通表一樣,按照正常儲存計量計費。

    • 動態物化視圖對某些operator可能會採取基於state的增量計算演算法,會產生內部state table消耗一定的儲存空間。

    • 動態物化視圖需要增量CDC、Time Travel儲存開銷,這部分儲存開銷和普通Delta Table類似。