メインコンテンツまでスキップ
に最終更新

非同期マテリアライズドビューの概要

非同期マテリアライズドビューは、ビューの柔軟性と物理テーブルの高い性能を組み合わせたクエリ高速化の仕組みです。クエリ結果を事前に計算して保存することで、後続のクエリはマテリアライズされた結果を直接利用でき、複雑な SQL を繰り返し実行する負荷を避けられます。

クイックガイド​

非同期マテリアライズドビューを使用する前に、次の点を確認してください。

  • 業務上、クエリの高速化、ETL の簡素化、レイクハウスの外部テーブルに対するクエリの高速化、または書き込みの最適化が必要ですか?
  • クエリは SPJG(SELECT-PROJECT-JOIN-GROUP-BY)パターンに従っていますか?
  • データの結果整合性(リアルタイムではない同期)を許容できますか?
  • ベーステーブルの Catalog はサポート対象(Internal/Hive/Iceberg/Paimon/Hudi/JDBC/ES)に含まれていますか?
  • リフレッシュのコストを抑えるために、パーティション単位の増分リフレッシュが必要ですか?

利用シーン​

非同期マテリアライズドビューは、主に次の四つのシーンを対象としています。

利用シーンメリット
クエリの高速化と同時実行性能の向上クエリ速度を大幅に向上させ、同時実行性能を高め、リソース消費を削減します
ETL ワークフローの簡素化抽出、変換、ロード(ETL)のプロセスを簡素化し、開発効率を向上させます
レイクハウスの外部テーブルに対するクエリの高速化レイクハウスアーキテクチャにおける外部データソースへのクエリ速度を大幅に向上させます
書き込み効率の向上リソース競合を減らし、データ書き込み処理を最適化して、整合性と完全性を確保します

制限事項​

非同期マテリアライズドビューを使用する前に、次の制限事項に注意してください。

  • データの整合性:非同期マテリアライズドビューはベーステーブルと結果整合性を保ちますが、リアルタイムに同期できず、リアルタイムの整合性は保証されません。
  • ウィンドウ関数:現在、ウィンドウ関数を含むクエリを、マテリアライズドビューに基づく形式へ透過的に書き換えることはサポートされていません。
  • 複数テーブルのケース:マテリアライズドビューの結合対象テーブルがクエリの対象より多い場合(たとえば、クエリは t1 と t2 のみを参照し、マテリアライズドビューは t1、t2、t3 を含む場合)、現在、透過的なクエリ書き換えはサポートされていません。
  • 透過的なクエリ書き換えでサポートされない演算子:マテリアライズドビューに UNION ALL、LIMIT、ORDER BY、または CROSS JOIN が含まれる場合、マテリアライズドビューは通常どおり作成できますが、透過的なクエリ書き換えには使用できません。
  • データ型の制限:現在、VARBINARY 型を含むマテリアライズドビューの作成はサポートされていません。

仕組み​

非同期マテリアライズドビューは、実質的には MTMV 型の内部テーブルです。マテリアライズドビューの作成時に、システムはリフレッシュタスクも登録します。このタスクが実行されると、INSERT OVERWRITE 文によって最新のデータがマテリアライズドビューに書き込まれます。

リフレッシュの仕組み​

同期マテリアライズドビューのリアルタイム増分リフレッシュとは異なり、非同期マテリアライズドビューでは、より柔軟なリフレッシュ方法を選択できます。

リフレッシュ方法説明適したケース
全件リフレッシュマテリアライズドビューの定義 SQL が参照するすべてのデータを再計算し、マテリアライズドビューに全件を書き込みますデータ量が少ない場合、または全体の整合性を保証する必要がある場合
パーティション単位の増分リフレッシュベーステーブルのパーティションデータの変更を識別し、影響を受けたパーティションのみをリフレッシュしますデータ量が多く、変更が特定のパーティションに集中している場合
  • 全件リフレッシュ:マテリアライズドビューのデータがベーステーブルと完全に一致するようにしますが、計算リソースと時間をより多く消費する場合があります。
  • パーティション単位の増分リフレッシュ:結果整合性を保ちながら、リフレッシュに必要なリソースと時間を大幅に削減します。

透過的なクエリ書き換え​

透過的なクエリ書き換えは、データベースがクエリ性能を最適化するための重要な手段です。ユーザーのクエリを処理する際、システムは適切なマテリアライズドビューを利用できるよう SQL を自動的に書き換え、実行効率を高めて計算コストを削減します。この処理はユーザーに対して透過的であり、操作は必要ありません。

Doris の非同期マテリアライズドビューは、SPJG(SELECT-PROJECT-JOIN-GROUP-BY)パターンに基づく透過的なクエリ書き換えアルゴリズムを使用します。

  1. SQL の構造情報を詳細に分析します。
  2. 透過的なクエリ書き換えに適したマテリアライズドビューを自動的に検出して選択します。
  3. 候補となるマテリアライズドビューが複数ある場合は、コストモデルなどの戦略に基づいて最適なものを選択し、クエリ性能をさらに向上させます。

データレイク上での非同期マテリアライズドビューの作成​

データレイク上に非同期マテリアライズドビューを作成する構文は、内部テーブル上に作成する場合と同じですが、次の点に注意してください。

  • メタデータの取得元:マテリアライズドビューのリフレッシュに必要なパーティションのバージョンなどの情報は、外部環境から直接取得するのではなく、データレイクのメタデータキャッシュから取得します。そのため、リフレッシュ完了後のデータは、Doris 経由でデータレイクにクエリした結果とは一致しますが、キャッシュの更新状況によっては、他のエンジンから得られる結果とは一致しない場合があります。
  • 外部での変更の検知:Doris が管理していない外部プロセス(Spark、Hive、Flink のジョブなど)によって基になる Hive データが変更されても、メタデータが変わらない場合(たとえば insert overwrite の実行時)、マテリアライズドビューはベーステーブルと整合していると誤って判断します。その結果、クエリ結果は Doris 経由でデータレイクにクエリした結果と一致しなくなります。この問題は、マテリアライズドビューを手動で強制リフレッシュすることで解決できます。
  • Iceberg の制限事項:Iceberg 上にパーティション化されたマテリアライズドビューを作成する場合、パーティション列が一つの Iceberg テーブルのみがサポートされます。また、パーティションの進化は限定的にサポートされます。たとえば、時間型パーティションの時間範囲の変更はサポートされますが、パーティションフィールド自体が変更されると、マテリアライズドビューのリフレッシュは失敗します。
  • Hudi の制限事項:Hudi 上にマテリアライズドビューを作成した場合、システムはベーステーブルのデータが変更されたかどうかを検知できません。マテリアライズドビュー(または一部のパーティション)が一度リフレッシュされると、ベーステーブルと同期しているとみなされます。そのため、Hudi 上のマテリアライズドビューは、必要に応じて手動でリフレッシュする場合にのみ適しています。

データレイクでのマテリアライズドビューのリフレッシュ対応状況​

次の表は、テーブルの種類と Catalog ごとのリフレッシュ対応状況を示します。

テーブルの種類 Catalog の種類 リフレッシュ方法 リフレッシュのトリガー
全件リフレッシュ パーティション単位のリフレッシュ 自動トリガー
内部テーブル Internal 2.1 でサポート 2.1 でサポート 2.1.4 でサポート
Hive Hive 2.1 でサポート 2.1 でサポート サポート対象外
Iceberg Iceberg 2.1 でサポート 3.1 でサポート サポート対象外
Paimon Paimon 2.1 でサポート 3.1 でサポート サポート対象外
Hudi Hudi 2.1 でサポート 3.1 でサポート サポート対象外
JDBC JDBC 2.1 でサポート サポート対象外 サポート対象外
ES ES 2.1 でサポート サポート対象外 サポート対象外

データレイクでの透過的なクエリ書き換えの対応状況​

非同期マテリアライズドビューの透過的なクエリ書き換え機能は、現在、次のテーブルの種類と Catalog をサポートしています。

ベーステーブルのデータ変更のリアルタイム検知:マテリアライズドビューが使用するベーステーブルのデータが変更された場合、その変更をリアルタイムに検知し、クエリで最新のデータを使用できることを意味します。

テーブルの種類 Catalog の種類 透過的なクエリ書き換えへの対応 ベーステーブルのデータ変更のリアルタイム検知
内部テーブル Internal サポート サポート
Hive Hive サポート 3.1 でサポート
Iceberg Iceberg サポート 3.1 でサポート
Paimon Paimon サポート 3.1 でサポート
Hudi Hudi サポート サポート対象外
JDBC JDBC サポート サポート対象外
ES ES サポート サポート対象外

外部テーブルを使用するマテリアライズドビューの透過的なクエリ書き換えの有効化​

マテリアライズドビューが外部テーブルを使用する場合、デフォルトでは透過的なクエリ書き換えの対象になりません。有効にするには、次のコマンドを実行します。

SET materialized_view_rewrite_enable_contain_external_table = true;

外部テーブルの透過的なクエリ書き換えの性能最適化​

2.1.11 以降、Doris では外部テーブルに対する透過的なクエリ書き換えの性能が最適化されました。主な改善点は、外部テーブルを含む利用可能なマテリアライズドビューを取得する処理の高速化です。

外部テーブルを含むパーティション化されたマテリアライズドビューで透過的なクエリ書き換えが遅い場合は、fe.conf の次のパラメータを調整できます。

パラメータデフォルト値説明バージョン
max_hive_partition_cache_num10000Hive Metastore におけるテーブル単位のパーティションキャッシュの最大数。Hive 外部テーブルに多数のパーティションがある場合は、20000 以上に設定します-
external_cache_expire_time_minutes_after_access10 分キャッシュされたオブジェクトへの最終アクセス後の有効期限。必要に応じて延長できます(外部テーブルのスキーマキャッシュと Hive のメタデータキャッシュの両方に適用されます)-
external_cache_refresh_time_minutes10 分外部テーブルのメタデータキャッシュ内のオブジェクトを自動更新する間隔。必要に応じて延長できます3.1+

外部テーブルのメタデータキャッシュの設定について詳しくは、メタデータキャッシュを参照してください。

マテリアライズドビューと OLAP 内部テーブルの関係​

非同期マテリアライズドビューの定義 SQL で使用するベーステーブルのモデルに制限はありません。Duplicate モデル、Unique モデル(merge-on-write または merge-on-read)、Aggregate モデルなどを使用できます。

マテリアライズドビュー自体の内部実装は Duplicate モデルの OLAP テーブルに基づいており、理論上は Duplicate モデルの主要な機能をすべてサポートできます。ただし、マテリアライズドビューのデータリフレッシュタスクを安定して効率的に実行するため、その機能には次の制限があります。

  • パーティション操作:マテリアライズドビューのパーティションは、ベーステーブルに基づいて自動的に作成・管理されます。ユーザーはマテリアライズドビューに対してパーティション操作を実行できません。
  • 削除と名前変更:マテリアライズドビューには関連するジョブ(JOB)があるため、DROP TABLE や RENAME TABLE コマンドでは操作できません。対応する操作には、マテリアライズドビュー専用のコマンドを使用してください。
  • 列のデータ型:マテリアライズドビューの列のデータ型は、作成時に指定したクエリ文から自動的に導出され、変更できません。変更すると、リフレッシュタスクが失敗する可能性があります。
  • プロパティの変更:マテリアライズドビューには、Duplicate テーブルにはないプロパティがあります。これらはマテリアライズドビュー専用のコマンドで変更する必要があります。その他の共通プロパティは ALTER TABLE コマンドで変更します。

よくある質問​

Q1: 非同期マテリアライズドビューは、ベーステーブルとのリアルタイムのデータ整合性を保証できますか?

いいえ。非同期マテリアライズドビューはベーステーブルと結果整合性を保ちますが、リアルタイムには同期できません。リアルタイムの整合性が必要な場合は、同期マテリアライズドビューを検討してください。

Q2: ウィンドウ関数を含むクエリを書き換えられないのはなぜですか?

現在の透過的なクエリ書き換えアルゴリズムは、まだウィンドウ関数をサポートしていません。ウィンドウ関数を含むクエリは、マテリアライズドビューに基づく形式には書き換えられません。

Q3: 外部テーブルに基づくマテリアライズドビューが、クエリ書き換えで利用されないのはなぜですか?

外部テーブルに基づくマテリアライズドビューは、デフォルトでは透過的なクエリ書き換えの対象になりません。materialized_view_rewrite_enable_contain_external_table = true を設定すると、書き換えの対象になります。

Q4: 外部プロセスによって Hive 外部テーブルのデータを変更した後、マテリアライズドビューのクエリ結果が一致しないのはなぜですか?

Spark、Hive、Flink などの外部プロセスによって Hive データが変更されても、メタデータが変わらない場合(たとえば insert overwrite)、マテリアライズドビューは変更を検知できません。マテリアライズドビューを手動で強制リフレッシュすることで、この問題を解決できます。

Q5: Hudi に基づくマテリアライズドビューは自動的にリフレッシュできますか?

ベーステーブルの変更を検知できないため、必要に応じて手動でリフレッシュする場合にのみ適しています。

関連項目​