すべてのプロダクト
Search
ドキュメントセンター

MaxCompute:Delta Live MV

最終更新日:Aug 22, 2026

Delta Live マテリアライズドビュー (Delta Live MV) を使用すると、シンプルな増分更新パイプラインを構築できます。本トピックでは、MaxCompute で Delta Live MV を使用する方法について説明します。

概要

完全リフレッシュが必要なマテリアライズドビューと比較して、Delta Live MV はデータの鮮度とコンピューティングコストのバランスを取ります。既存の計算結果をインテリジェントに再利用し、増分計算アルゴリズムを適用することで、コンピューティングコストを削減し、データの鮮度を向上させます。

アーキテクチャ

image

主な利点

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

いいえ

自動更新を有効にするかどうかを指定します。

  • true:自動更新を有効にします。

  • false:自動更新を無効にします。

refresh_mode

いいえ

更新モード。

  • full:完全リフレッシュ。

  • incremental:増分リフレッシュ。

refresh_cron

いいえ

更新頻度を設定するための QUARTZ cron 式。間隔、特定時刻、またはその両方を組み合わせた更新スケジュールを設定できます。

値は QUARTZ cron 形式の文字列です。詳細については、「cron 式の例」をご参照ください。以下は例です:

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:シンプルな 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

更新が終了した時刻。ジョブの state が RUNNING の場合、このフィールドは NULL です。

instance_id

ジョブ ID。この ID を使用して Logview を開くことができます。

duration_in_seconds

更新期間 (秒)。

state

ジョブの状態:

  • RUNNING

  • TERMINATED

  • FAILED

  • CANCELLED

refresh_trigger

更新方法:

  • MANUAL:ユーザーによる手動トリガー、または DataWorks を使用したスケジュール更新。

  • SYSTEM_SCHEDULED:MaxCompute の内部スケジューラによる更新。

refresh_mode

更新モード:

  • FULL

  • INCREMENTAL

  • NO_DATA

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 テーブルと同様です。