Delta Live マテリアライズドビュー (Delta Live MV) を使用すると、シンプルな増分更新パイプラインを構築できます。本トピックでは、MaxCompute で Delta Live MV を使用する方法について説明します。
概要
完全リフレッシュが必要なマテリアライズドビューと比較して、Delta Live MV はデータの鮮度とコンピューティングコストのバランスを取ります。既存の計算結果をインテリジェントに再利用し、増分計算アルゴリズムを適用することで、コンピューティングコストを削減し、データの鮮度を向上させます。
アーキテクチャ

主な利点
MaxCompute Delta Live MV には、以下の利点があります。
宣言的でフルマネージドな自動化プロセスにより、データウェアハウスの階層化を実現します。
簡素化されたデータウェアハウスアーキテクチャ:単一の計算ロジックと単一のエンジンで、増分計算と完全計算の両方をサポートし、低レイテンシと高スループットの両方の要求を満たします。
コスト効率:データの鮮度とコンピューティングコストのバランスを取り、統合された増分処理と完全処理を効率的に実行します。
ユースケース
Delta Live MV 機能は、以下のユースケースに適しています。
ニアリアルタイムデータウェアハウス
T+1 データウェアハウスから分単位のレイテンシのニアリアルタイムデータウェアハウスへの進化が可能になります。
統合された増分処理と完全処理
当日のパーティションに対するニアリアルタイムの増分計算により、高いデータの鮮度とコスト効率を実現します。
(オプション) データのアーカイブ、修正、大規模データ分析のための履歴パーティションのバックフィル。
さまざまな SQL 構文による増分計算を包括的にサポートし、以下の一般的な SQL 演算子を含みます。
2 ストリーム INNER JOIN
2 ストリーム LEFT/RIGHT OUTER JOIN
すべての AGGREGATE 関数 (UDAF を除く)。GROUP BY または AGG を含まないものも含みます。
WINDOW
TableFunctionScan
UNION ALL
FILTER/Project
SUBQUERY
前提条件
MaxCompute プロジェクトが必要です。
ソーステーブルで変更データキャプチャ (CDC) が有効になっている必要があります。以下のソーステーブルタイプがサポートされています:
CDC 機能が明示的に有効化された Delta テーブル。
別の Delta Live MV。Delta Live MV では、CDC がデフォルトで有効になっています。
Delta Live MV には、RAND 関数や UDF などの非決定的計算を 含めることはできません。
Delta Live MV の作成
構文
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 の構文は、標準のマテリアライズドビューの構文と互換性がありますが、以下の点で異なります:
Delta Live MV はクラスターテーブルとして作成できません。
Delta Live MV では、
enable_auto_substituteパラメータを true に設定できません。Delta Live MV は非同期マテリアライズドビューであるため、ベーステーブルのデータが最新バージョンではない場合があります。これは、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 | いいえ | 自動更新を有効にするかどうかを指定します。
|
refresh_mode | いいえ | 更新モード。
|
refresh_cron | いいえ | 更新頻度を設定するための QUARTZ cron 式。間隔、特定時刻、またはその両方を組み合わせた更新スケジュールを設定できます。 値は QUARTZ cron 形式の文字列です。詳細については、「cron 式の例」をご参照ください。以下は例です: |
refresh_job_settings | いいえ |
|
select_statement | はい | SQL クエリステートメント。 |
例
例 1:シンプルな Delta Live MV の作成
5 分ごとに自動で増分リフレッシュを実行する、mv1 という名前の Delta Live MV を定義します。ソーステーブルは CDC が有効化された Delta テーブルです。
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:チューニングパラメータを使用したビューの作成
SET odps.task.major.version=sql_flighting_dlmv;
CREATE MATERIALIZED VIEW IF NOT EXISTS part_dlmv_department
PRIMARY KEY(dept_id) -- プライマリキーは SQL ロジックから推論できます。ただし、パーティション MV は BUILD DEFERRED モードのみをサポートし、明示的に宣言されたプライマリキーが必要なため、ここで宣言する必要があります。
LIFECYCLE 10
BUILD DEFERRED
PARTITIONED BY (pt)
TBLPROPERTIES('refresh_mode'='incremental',
'refresh_job_settings'='set odps.task.major.version=sql_flighting_dlmv;')
AS
SELECT *, get_setting('odps.custom.setting.department.pt') AS pt FROM t_department; MV 更新のためのプライマリキー要件:
更新をサポートするためには、Delta Live MV にプライマリキー (PK) が必要です。PK を明示的に宣言する必要があるかどうかは、状況によって異なります。
プライマリキーが SQL ロジックから自動的に推論できる場合
たとえば、SQL に GROUP BY key が含まれている場合、MV のプライマリキーは自動的に key として推論され、明示的に宣言する必要はありません。
DESC EXTENDED mvName;コマンドを実行することで、推論されたプライマリキーカラムを表示できます。プライマリキーが SQL ロジックから自動的に推論できない場合
方法 1:GROUP BY 句を追加して MV の SQL ロジックを変更し、自動推論条件を満たすようにします。
方法 2:プライマリキーを明示的に宣言します。データ自体が一意性制約を満たしている必要があります。システムは、各増分リフレッシュでデータの一意性を検証しようとします。初期データロードの一意性チェックは最適化中であり、将来のリリースで利用可能になります。
パーティション MV の特別な要件
パーティション MV は現在 BUILD DEFERRED モードのみをサポートしており、自動プライマリキー推論をサポートしていません。そのため、プライマリキーを明示的に宣言する必要があります。
パーティションDelta Live MV
シナリオ 1:パーティション Delta Live MV を使用して、当日の増分データと履歴レコードの完全データを表現
SET odps.task.major.version=sql_flighting_dlmv;
CREATE MATERIALIZED VIEW IF NOT EXISTS part_dlmv_department
PRIMARY KEY(dept_id) -- プライマリキーは SQL ロジックから推論できます。ただし、パーティション MV は BUILD DEFERRED モードのみをサポートし、明示的に宣言されたプライマリキーが必要なため、ここで宣言する必要があります。
LIFECYCLE 10
BUILD DEFERRED
PARTITIONED BY (pt)
TBLPROPERTIES('refresh_mode'='incremental',
'refresh_job_settings'='set odps.task.major.version=sql_flighting_dlmv;')
AS
-- t_department は、主に当日の増分データを含むニアリアルタイムの取り込みテーブルです。
SELECT *, get_setting('odps.custom.setting.department.pt') AS pt FROM t_department;
UNION ALL
-- history_t_department は、すべての履歴データを含む履歴パーティションテーブルです。
SELECT * FROM history_t_department;シナリオ 2:group by key を使用した DLMV の PK カラムの導出
// pk delta table
CREATE TABLE dlmv_base_table(
key STRING NOT NULL PRIMARY KEY,
value BIGINT,
value2 BIGINT
)
STORED AS ALIORC
TBLPROPERTIES (
'transactional' = 'true',
'cdc.insert.into.passthrough.enable' = 'true',
'acid.cdc.mode.enable' = 'true',
'acid.cdc.build.async' = 'false'
);
CREATE MATERIALIZED VIEW dlmv_pt
PRIMARY KEY(value) -- プライマリキーは SQL ロジックから推論できます。ただし、パーティション MV は BUILD DEFERRED モードのみをサポートし、明示的に宣言されたプライマリキーが必要なため、ここで宣言する必要があります。
build deferred
partitioned BY (pt)
TBLPROPERTIES (
'refresh_mode' = 'incremental',
'enable_auto_refresh' = 'true'
)
AS SELECT *, get_setting('odps.custom.setting.dlmv_pt.pt') AS pt FROM (SELECT value, MAX(value2) FROM dlmv_base_table GROUP BY value) t;シナリオ 3:ベーステーブルのプライマリキーからの Delta Live MV プライマリキーカラムの推論
// pk delta table
CREATE TABLE dlmv_base_table(
key STRING NOT NULL PRIMARY KEY,
value BIGINT,
value2 BIGINT
)
STORED AS ALIORC
TBLPROPERTIES (
'transactional' = 'true',
'cdc.insert.into.passthrough.enable' = 'true',
'acid.cdc.mode.enable' = 'true',
'acid.cdc.build.async' = 'false'
);
CREATE MATERIALIZED VIEW dlmv_pt
PRIMARY KEY(key) -- プライマリキーは SQL ロジックから推論できます。ただし、パーティション MV は BUILD DEFERRED モードのみをサポートし、明示的に宣言されたプライマリキーが必要なため、ここで宣言する必要があります。
build deferred
partitioned BY (pt)
TBLPROPERTIES (
'refresh_mode' = 'incremental',
'enable_auto_refresh' = 'true'
)
AS
SELECT key, value, value2, get_setting('odps.custom.setting.dlmv_pt.pt') as pt FROM dlmv_base_table;シナリオ 4:Delta Live MV プライマリキーカラムが推論できない場合
// pk delta table
CREATE TABLE dlmv_base_table(
key STRING NOT NULL PRIMARY KEY,
value BIGINT,
value2 BIGINT
)
STORED AS ALIORC
TBLPROPERTIES (
'transactional' = 'true',
'cdc.insert.into.passthrough.enable' = 'true',
'acid.cdc.mode.enable' = 'true',
'acid.cdc.build.async' = 'false'
);
# 1. プライマリキーカラムを明示的に宣言します
CREATE MATERIALIZED VIEW dlmv_pt
primary key(value) -- SQL ロジックから 'value' をプライマリキーとして推論できませんが、データ自体がプライマリキーの一意性を満たすことが分かっているため、プライマリキーを明示的に宣言します。
build deferred
partitioned BY (pt)
TBLPROPERTIES (
'refresh_mode' = 'incremental',
'enable_auto_refresh' = 'true'
)
AS
SELECT value, value2, get_setting('odps.custom.setting.dlmv_pt.pt') as pt FROM dlmv_base_table;
# 2. プライマリキー推論を可能にするために SQL ロジックを変更します
-- 'value' カラムの一意性が保証できない場合、以下のように group by 句を使用してロジックを変更できます。
CREATE MATERIALIZED VIEW dlmv_pt
primary key(value) -- プライマリキーは SQL ロジックから推論できます。ただし、パーティション MV は BUILD DEFERRED モードのみをサポートし、明示的に宣言されたプライマリキーが必要なため、ここで宣言する必要があります。
build deferred
partitioned BY (pt)
TBLPROPERTIES (
'refresh_mode' = 'incremental',
'enable_auto_refresh' = 'true'
)
AS SELECT value, MAX(value2), get_setting('odps.custom.setting.dlmv_pt.pt') as pt FROM dlmv_base_table GROUP BY value;非パーティションDelta Live MV
シナリオ 1:group by key を使用した DLMV の PK カラムの導出
// pk delta table
CREATE TABLE dlmv_base_table(
key STRING NOT NULL PRIMARY KEY,
value BIGINT,
value2 BIGINT
)
STORED AS ALIORC
TBLPROPERTIES (
'transactional' = 'true',
'cdc.insert.into.passthrough.enable' = 'true',
'acid.cdc.mode.enable' = 'true',
'acid.cdc.build.async' = 'false'
);
CREATE MATERIALIZED VIEW dlmv
-- primary key(value) は SQL ロジック (group by value) から推論できるため、明示的な宣言は不要です。
TBLPROPERTIES (
'refresh_mode' = 'incremental',
'enable_auto_refresh' = 'true'
)
AS SELECT value, MAX(value2) FROM dlmv_base_table GROUP BY value;シナリオ 2:ベーステーブルのプライマリキーからの Delta Live MV プライマリキーカラムの推論
// pk delta table
CREATE TABLE dlmv_base_table(
key STRING NOT NULL PRIMARY KEY,
value BIGINT,
value2 BIGINT
)
STORED AS ALIORC
TBLPROPERTIES (
'transactional' = 'true',
'cdc.insert.into.passthrough.enable' = 'true',
'acid.cdc.mode.enable' = 'true',
'acid.cdc.build.async' = 'false'
);
CREATE MATERIALIZED VIEW dlmv
-- primary key(key) は SQL ロジック (ベーステーブルのプライマリキーから導出) から推論できるため、明示的な宣言は不要です。
TBLPROPERTIES (
'refresh_mode' = 'incremental',
'enable_auto_refresh' = 'true'
)
AS
SELECT key, value, value2 FROM dlmv_base_table;シナリオ 3:Delta Live MV プライマリキーカラムが推論できない場合
// pk delta table
CREATE TABLE dlmv_base_table(
key STRING NOT NULL PRIMARY KEY,
value BIGINT,
value2 BIGINT
)
STORED AS ALIORC
TBLPROPERTIES (
'transactional' = 'true',
'cdc.insert.into.passthrough.enable' = 'true',
'acid.cdc.mode.enable' = 'true',
'acid.cdc.build.async' = 'false'
);
# 1. プライマリキーカラムを明示的に宣言します
CREATE MATERIALIZED VIEW dlmv
primary key(value) -- SQL ロジックから 'value' をプライマリキーとして推論できませんが、データ自体がプライマリキーの一意性を満たすことが分かっているため、プライマリキーを明示的に宣言します。
TBLPROPERTIES (
'refresh_mode' = 'incremental',
'enable_auto_refresh' = 'true'
)
AS
SELECT value, value2 FROM dlmv_base_table;
# 2. プライマリキー推論を可能にするために SQL ロジックを変更します
-- 'value' カラムの一意性が保証できない場合、以下のように group by 句を使用してロジックを変更できます。
CREATE MATERIALIZED VIEW dlmv
-- primary key(value) は SQL ロジック (group by value) から推論できるため、明示的な宣言は不要です。
TBLPROPERTIES (
'refresh_mode' = 'incremental',
'enable_auto_refresh' = 'true'
)
AS SELECT value, MAX(value2) FROM dlmv_base_table GROUP BY value;例 3:単一パーティションの更新
パーティション Delta Live MV を作成する際は、DDL 操作のみが実行されることを示すために BUILD DEFERRED キーワードを追加する必要があります。
-- Delta Live MV を作成します。
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');Delta Live MV を手動で更新する方法の詳細については、「Delta Live MV の手動更新」をご参照ください。
例 4:パラメータ化された定義の使用
パラメータ化された定義を使用すると、オフラインのパーティションジョブを増分ジョブに移行するのに役立ちます。
get_setting関数は、セッションフラグで設定されたパラメータの値を取得するために使用します。パラメータにはodps.custom.settingのプレフィックスを付ける必要があります。従来のオフラインジョブの
${biz_date}をget_setting(odps.custom.setting.xx)に置き換えて、パラメータ化を完了します。Delta Live MV 更新ステートメントの前に、セッションフラグ
set odps.custom.setting.xx=yyを追加します。実行時に、MaxCompute オプティマイザーは Delta Live MV 内の
get_setting(odps.custom.setting.xx)を自動的にyyに置き換えます。
例:
-- Delta Live MV を作成します。
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});Delta Live MV の管理
Delta Live MV の削除
DROP MATERIALIZED VIEW [IF EXISTS] [<project_name>.]<mv_name>;手動更新
Delta Live MV を手動で更新できます。手動更新は単一パーティションのみをサポートします。
ALTER MATERIALIZED VIEW [<project_name>.]<mv_name>
REBUILD [PARTITION(<ds>=max_pt(<table_name>),<expression1>...)];この構文では、ds はパーティションカラムです。
自動更新の無効化
自動更新機能を無効にするには、次のコマンドを実行します。
ALTER MATERIALIZED VIEW <mv_name> SET TBLPROPERTIES("enable_auto_refresh"="false");自動更新の再開
次のコマンドを実行して、マテリアライズドビューの TBLPROPERTIES を変更し、自動更新を有効にします。
ALTER MATERIALIZED VIEW <mv_name> SET TBLPROPERTIES("enable_auto_refresh"="true");更新頻度の変更
次のコマンドを実行して、Delta Live MV の更新頻度を変更します。
ALTER MATERIALIZED VIEW <mv_name>
SET TBLPROPERTIES("refresh_interval_minutes"="xx");refresh_interval_minutes パラメータの最小値は 1 です。この値は、ベーステーブルの CDC ライフサイクルよりも小さく設定することを推奨します。
Delta Live MV の表示
データ変更履歴の表示
次のコマンドを実行して、Delta Live MV のデータ変更レコードを表示します。
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更新履歴の表示
次のコマンドを実行して、Delta Live MV の更新履歴を表示します。
SELECT * FROM
Delta_Live_MV_Refresh_History('<project_name>', '<schema_name>', '<table_name>');パラメータ
パラメータ | 説明 |
project_name | プロジェクト名。 |
schema_name | スキーマ名。 |
table_name | テーブル名。 |
戻り値
フィールド | 説明 |
project_name | Delta Live MV が含まれるプロジェクト。 |
schema_name | Delta Live MV が含まれるスキーマ。 |
name | Delta Live MV の名前。 |
refresh_start_time | 更新が開始された時刻。 |
refresh_end_time | 更新が終了した時刻。ジョブの |
instance_id | ジョブ ID。この ID を使用して Logview を開くことができます。 |
duration_in_seconds | 更新期間 (秒)。 |
state | ジョブの状態:
|
refresh_trigger | 更新方法:
|
refresh_mode | 更新モード:
|
error_message | 更新が失敗した場合のエラーメッセージ。更新が成功した場合、この値は NULL です。 |
source_tables | 更新に使用されたベーステーブルの名前とバージョン。 |
numInsertedRows | 挿入された行数。 |
numDeletedRows | 削除された行数。 |
課金
Delta Live MV は、コンピューティングとストレージの両方で料金が発生します。課金方法は、通常のマテリアライズドビュー操作と同じです。
コンピューティングコスト
Delta Live MV を作成または更新する際に、データを計算するためのジョブが開始されると、コンピューティングリソースが消費され、コンピューティングコストが発生します。課金ルールは、標準の SQL ジョブと同じです。
自動更新がトリガーされてもデータの変更がない場合、MaxCompute は更新ジョブを開始せず、料金は発生しません。
自動更新ジョブ、コンピューティングリソースの使用状況、コストを簡単に追跡できるよう、Delta Live MV を専用のプロジェクトに配置することを推奨します。
ストレージ料金
Delta Live MV は、標準のマテリアライズドビューや通常のテーブルと同じ方法でストレージに対して課金されます。
一部の演算子では、Delta Live MV がステートベースの増分計算アルゴリズムを使用することがあり、内部状態テーブルが生成され、追加のストレージが消費されます。
Delta Live MV は、CDC とタイムトラベルのためのストレージオーバーヘッドが発生します。このオーバーヘッドは、標準の Delta テーブルと同様です。