増分マテリアライズドビュー
要点 Apache Doris の増分マテリアライズドビューは、
PARTITION BYとREFRESH AUTOを指定した、パーティション化された非同期 MTMV です。Apache Doris はパーティションごとにデータが古くなったかを追跡するため、今日のデータをロードすると、今日のビューパーティションだけが更新され、残りの 29 日分はそのままになります。最新のデータと古くなったデータの両方を含む期間のクエリでも、ビューを利用できます。オプティマイザーは有効なパーティションを MV から読み取り、古くなったパーティションのデータをベーステーブルから読み取ってUNION ALLで結合します。

Apache Doris で増分マテリアライズドビューを使う理由
Apache Doris の増分マテリアライズドビューは、ロードのたびにビュー全体を再集計するのではなく、ベースデータが変更されたパーティションだけを再計算して、パーティション化されたデータを参照するダッシュボードを最新に保ちます。日単位でパーティション化されたファクトテーブルと、それを集計して翌日のダッシュボードに表示するマテリアライズドビューがあるとします。今日のロードでは今日のパーティションにしか書き込まないのに、単純な更新ではビュー全体を再計算します。変更のない 29 日分まで再集計するため、更新に一時間かかり、完了時にはダッシュボードのデータがすでに古くなっています。
- 30 日分のデータを持つパーティション化されたファクトテーブルで、各ロードが最新の日付にしか影響しない場合。全体更新では、変更のない 29 日分も再集計します。
- MV の更新にかかる時間がロード間隔より長く、BI ダッシュボードのデータがロードスケジュールに追いつかない場合。
- オブジェクトストレージを介してすべてのパーティションを再読み込みすると時間と費用がかかる、Hive または Iceberg をベースとするレイクハウステーブル。
パーティション化された非同期 MV に REFRESH AUTO を指定すると、更新の対象を実際に変更された部分に絞れます。Apache Doris はパーティションごとにデータが古くなったかを追跡し、ベースデータが変更されたパーティションにだけ INSERT OVERWRITE を実行して、ビューの残りの部分はそのままにします。
Apache Doris の増分マテリアライズドビューとは
Apache Doris の増分マテリアライズドビューは、REFRESH AUTO を指定して作成した、パーティション化された非同期マテリアライズドビュー(MTMV)です。Apache Doris は、PARTITION BY で指定した一つのベーステーブルからビューパーティションを導出します。オプションの DATE_TRUNC を使えば、ベーステーブルの日単位のパーティションをビューでは月単位にまとめられます。ベースパーティションのデータが変更されると、対応するビューパーティションだけが無効とマークされます。次の更新では、無効なパーティションに対して INSERT OVERWRITE を一文ずつ実行します。
主な用語
MTMV: すべての非同期 MV の基盤となる内部テーブル型です。Duplicate モデルの OLAP テーブルであり、パーティションはユーザーではなく更新ジョブが管理します。REFRESH AUTO: 最初にパーティション単位の増分更新を試み、MV の定義からパーティションを導出できない場合にのみ全体更新に切り替える更新方式です。増分更新を使わない場合はREFRESH COMPLETEを指定します。Partition derivation: パーティションの導出とは、MV の SQL をたどり、MV のパーティション列をベーステーブルのパーティション列に対応付ける FE の解析です。導出に失敗すると、Doris は作成時にパーティション句を拒否します。Partition invalidation: パーティションの無効化は、そのパーティションの元となるベースデータが変更されたときに設定される、パーティションごとのデータが古いことを示すフラグです。SHOW PARTITIONS FROM <mv>で確認できます。Partition-granularity transparent rewrite: パーティション単位の透過的な書き換えでは、有効な MV パーティションを読み取り、残りをベーステーブルから読み取ってUNION ALLで結合できます。そのため、一つのパーティションが古くなっても、MV 全体が利用対象から外れることはありません。
Apache Doris の増分マテリアライズドビューの仕組み
Apache Doris の増分マテリアライズドビューは、作成時に各 MV パーティションをベースパーティションに対応付けます。ロードが行われると影響を受ける MV パーティションだけを無効とマークし、次の更新時にそれらのパーティションだけを INSERT OVERWRITE で再構築します。以下の五つの手順で、パーティションの指定、実体化、無効化、更新、パーティション単位の書き換えを説明します。
- パーティションの対応付けを指定します。
PARTITION BY (DATE_TRUNC(o_orderdate, 'MONTH'))は、orders.o_orderdateから MV のパーティションを導出するよう Apache Doris に指示します。内部テーブルと Hive テーブルの両方に対応しています。Iceberg、Paimon、Hudi は 3.1 でパーティション単位の更新に対応し、Iceberg と Paimon ではベースデータの変更も自動検出できます。Hudi では手動更新が必要です。 - Apache Doris がパーティション構成を実体化します。 作成時に FE がベースパーティションを調べ、ロールアップ関数を適用して、対応する MV パーティションを作成します。新しいベースパーティションができると、次の更新時に新しい MV パーティションも作成されます。
- ロードはビュー全体ではなくパーティションを無効化します。
ordersのp_2026_05_08パーティションに入ったロードは、その日のデータを含む MV パーティションだけを無効とマークします。参照先にパーティション化されていないテーブルがある場合、そのテーブルへのロードはデフォルトで全体を無効化します。そのテーブルに対して更新は行わず、挿入しか行わないと分かっている場合は、excluded_trigger_tablesに列挙します。 - 更新ジョブは無効なパーティションだけを再構築します。 無効なパーティションごとに
INSERT OVERWRITEが実行されます。refresh_partition_numプロパティは一文あたりに処理するパーティション数を制御します(デフォルトは 1)。トランザクションの粒度と処理量の間で調整できます。失敗するとタスクは停止しますが、すでに更新済みのパーティションはロールバックされません。 - オプティマイザーはパーティション単位で書き換えます。 最新の日付と古くなった日付の両方を対象とするクエリは、最新のデータを MV から、古くなった日のデータをベーステーブルから読み取り、
UNION ALLで結合します。データが古くなってから N 秒未満のパーティションも書き換えに使用したい場合は、grace_periodを設定します。
クイックスタート
CREATE TABLE lineitem (
l_orderkey INT, l_extendedprice DECIMAL(15,2),
l_discount DECIMAL(15,2), l_ordertime DATETIME
) DUPLICATE KEY(l_orderkey)
PARTITION BY RANGE(l_ordertime)
(FROM ('2026-05-01') TO ('2026-05-09') INTERVAL 1 DAY)
DISTRIBUTED BY HASH(l_orderkey) BUCKETS 3;
CREATE MATERIALIZED VIEW daily_revenue
BUILD IMMEDIATE REFRESH AUTO ON SCHEDULE EVERY 1 HOUR
PARTITION BY (DATE_TRUNC(l_ordertime, 'DAY'))
DISTRIBUTED BY RANDOM BUCKETS 2 AS
SELECT DATE_TRUNC(l_ordertime, 'DAY') AS d,
SUM(l_extendedprice * (1 - l_discount)) AS revenue
FROM lineitem GROUP BY DATE_TRUNC(l_ordertime, 'DAY');
期待される結果
2026-05-08 のベースパーティションにだけ新しい行をロードした後、SHOW PARTITIONS FROM daily_revenue で、更新された MV パーティションが一つだけであることを確認できます。
+--------------+--------+---------------------+
| PartitionName| State | VisibleVersionTime |
+--------------+--------+---------------------+
| p_20260507 | NORMAL | 2026-05-07 14:00:02 |
| p_20260508 | NORMAL | 2026-05-08 15:00:01 |
+--------------+--------+---------------------+
それより前のパーティションでは再計算が行われていないため、VisibleVersionTime は以前の値のままです。p_20260508 だけが、その日のデータに対する一つの INSERT OVERWRITE 文で再構築されます。
Apache Doris の増分マテリアライズドビューを使うべき場面
Apache Doris の増分マテリアライズドビューは、日単位または時間単位でパーティション化された追記主体のファクトテーブル、多層の DWD/DWS/ADS モデリング、ローカルに実体化したい Hive/Iceberg/Paimon のレイクハウステーブルに適しています。秒未満の鮮度が必要な場合は同期 MV を使ってください。また、パーティション化されていないベーステーブルや、Apache Doris がベースデータの変更を自動検出できない Hudi テーブルにも適していません。
適している場面
- 日単位または時間単位でパーティション化された追記主体のファクトテーブルで、後段のダッシュボードも同じ列で集計する場合。
- 更新頻度の高いベースレイヤーから、パーティションの対応付けを持つ MV を介して、より粗い粒度の表示レイヤーにデータを渡す多層(DWD、DWS、ADS)モデリング。
- 安価な増分更新を使い、Doris のローカルストレージに実体化したい Hive、Iceberg(3.1+)、Paimon(3.1+)のレイクハウステーブル。
- 最新のパーティションが一時的に古くなっていても、パーティション単位の書き換えによって MV から結果を取得できる、長い期間を対象とするクエリ。
適していない場面
- 秒単位のリアルタイム性が必要な場合。代わりに同期マテリアライズドビューを使ってください。同期 MV はベーステーブルへの書き込み経路に組み込まれます。
- パーティション列がないテーブル。パーティションの対応付けがないと、MV は全体更新に切り替わり、増分更新の利点を得られません。
- パーティションを導出できない MV 定義。八つの導出ルールのいずれかを満たさない場合、Apache Doris は作成時に
PARTITION BY句を拒否します。たとえば、パーティション列を集約する(min(o_orderdate))、OUTER JOIN の NULL が生成される側に置く、GROUP BYまたはウィンドウのPARTITION BYから除外する、DATE_TRUNC以外のロールアップ関数を使う、といった場合です。 - Hudi のベーステーブル。現在、Apache Doris は Hudi 上のベースデータの変更を検出できません。そのため手動更新しか意味がなく、増分更新の要否を自動で判断できません。
- Apache Doris を経由せず、Spark や Flink からも書き込むテーブル。メタデータキャッシュはその書き込みを認識できず、MV はデータが同期されていると判断したままになります。外部から書き込むたびに手動で更新するか、別のクエリ高速化手段を選んでください。
関連情報
- 非同期マテリアライズドビューの概要: 更新モード、透過的な書き換え、レイクハウスの注意点
- 非同期 MV のベストプラクティス: シナリオの評価、更新戦略、パーティション化された MV の例
CREATE ASYNC MATERIALIZED VIEW: 完全な構文、パーティション導出ルール、テーブルプロパティ- 同期マテリアライズドビュー: リアルタイムの単一テーブル高速化
- 事前集計とロールアップ: ロードごとの Aggregate Key の仕組みと、非同期 MV と組み合わせて使う同期 MV / ROLLUP。
- クエリキャッシュ: もう一つの事前集計手段。MV で事前計算するか、初回の読み取り時にキャッシュします。
- データリネージ: 監査ログの
chosen_m_views列を使い、どの MV が実際にトラフィックを処理しているかを確認する方法。 - Iceberg: 増分 MV の一般的なベーステーブルのソース。スナップショット間の差分によって変更を低コストで把握できます。