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

AnalyticDB:リアルタイム マテリアライズドビュー

最終更新日:Jul 02, 2025

AnalyticDB for PostgreSQL は、リアルタイム マテリアライズドビューを提供します。標準のマテリアライズドビューと比較して、リアルタイム マテリアライズドビューは、REFRESH 文を実行する必要なく、データの変更時に自動的にリフレッシュできます。

AnalyticDB for PostgreSQL のリアルタイム マテリアライズドビューは、増分更新をサポートしています。リアルタイム マテリアライズドビューのベーステーブルが変更されると、リアルタイム マテリアライズドビューはそれに応じて増分的に更新されます。リアルタイム マテリアライズドビューを使用して、リアルタイムの抽出・変換・書き出し (ETL) ジョブと同様のデータ処理を実行できます。また、以前に作成したリアルタイム マテリアライズドビューに基づいて、別のリアルタイム マテリアライズドビューを作成することもできます。ベーステーブルが変更されると、2 つのリアルタイム マテリアライズドビューが自動的に更新されます。このようにして、リアルタイム ETL ジョブを構築してデータ分析を実行できます。

AnalyticDB for PostgreSQL のリアルタイム マテリアライズドビューは、同期モードと非同期モードの 2 つのモードをサポートしています。

  • 同期モードでは、リアルタイム マテリアライズドビューはSQL 文に基づいて自動的に更新されます。INSERTCOPYUPDATEDELETEなどの SQL 文がベーステーブルで実行されると、ベーステーブルに基づいて作成されたリアルタイム マテリアライズドビューがリアルタイムで更新され、強力なデータ整合性が確保されます。リアルタイム マテリアライズドビューの更新が完了していない場合、書き込みトランザクションをコミットできません。

  • 非同期モードでは、ベーステーブルに書き込み操作を実行した後、書き込みトランザクションがコミットされます。その後、データベースシステムは、バックグラウンドで、ベーステーブルに基づいて作成されたリアルタイム マテリアライズドビューの増分更新を自動的にスケジュールします。システム負荷が想定の範囲内であれば、リアルタイム マテリアライズドビューのデータ更新は数秒以内に完了します。

標準のマテリアライズドビューの詳細については、「マテリアライズドビューの管理」をご参照ください。

同期モード

同期モードでは、AnalyticDB for PostgreSQL のリアルタイム マテリアライズドビューは、SQL 文に基づいてデータ整合性を実装します。ベーステーブルで SQL 文が実行されると、ベーステーブルに基づいて作成されたリアルタイム マテリアライズドビューがリアルタイムで更新されます。次のセクションでは、更新ロジックについて説明します。

  • データベースシステムは、ベーステーブルの更新を実行し、次にマテリアライズドビューの更新を実行します。ベーステーブルの更新に失敗した場合、マテリアライズドビューのデータは変更されません。

  • マテリアライズドビューの更新に失敗した場合、ベーステーブルの更新も失敗します。ベーステーブルのデータは変更されず、更新文に対してエラーメッセージが返されます。

BEGIN 文と COMMIT 文を使用して明示的なトランザクションをコミットする場合、ベーステーブルで更新文が実行された後、マテリアライズドビューのデータ更新もトランザクションに含まれます。

  • AnalyticDB for PostgreSQL が READ COMMITTED 分離レベル を使用する場合、マテリアライズドビューのデータ更新は、トランザクションがコミットされるまで、他のトランザクションには見えません。

  • トランザクションがロールバックされた場合、ベーステーブルとマテリアライズドビューもロールバックされます。

サポートされているバージョン

デフォルトでは、次のバージョンの AnalyticDB for PostgreSQL インスタンスは、同期モードでリアルタイム マテリアライズドビューを使用します。

  • V7.0.6.9 より前の AnalyticDB for PostgreSQL V7.0 インスタンス。

  • V6.6.2.5 より前の AnalyticDB for PostgreSQL V6.0 インスタンス。

リアルタイム マテリアライズドビューのデフォルトモードを変更するには、チケットを送信する

非同期モード

非同期モードでは、ベーステーブルに書き込み操作を実行した後、書き込みトランザクションはコミットされますが、リアルタイム マテリアライズドビューのデータはすぐに更新されません。トランザクションがコミットされた後、データベースシステムはバックグラウンドでリアルタイム マテリアライズドビューの増分更新を自動的にスケジュールし、同時書き込みトランザクションを処理します。リアルタイム マテリアライズドビューが更新されると、ベーステーブルに対する複数の更新操作が一度に実行される場合があります。データベースシステムは、ベーステーブルに対するすべての同時書き込み操作をバッチ処理して、最終的なデータ整合性を確保します。このように、非同期モードで同時書き込み操作が実行された場合でも、データベースシステムは、リアルタイム マテリアライズドビューのデータが最終的にベーステーブルのデータと整合するようにします。システム負荷が想定の範囲内であれば、リアルタイム マテリアライズドビューのデータ更新は数秒以内に完了します。したがって、非同期モードは、ほとんどのリアルタイム データウェアハウス シナリオの要件を満たすことができます。

サポートされているバージョン

デフォルトでは、次のバージョンの AnalyticDB for PostgreSQL インスタンスは、新しいリアルタイム マテリアライズドビューを非同期モードで使用します。

  • V7.0.6.9 以降の AnalyticDB for PostgreSQL V7.0 インスタンス。

  • V6.6.2.5 以降の AnalyticDB for PostgreSQL V6.0 インスタンス。

リアルタイム マテリアライズドビューのデフォルトモードを変更するには、チケットを送信する

制限事項

AnalyticDB for PostgreSQL は、リアルタイム マテリアライズドビューの作成に使用するクエリ文に次の制限を課しています。

  • クエリ文には、ほとんどのフィルタリング操作、射影操作、PostgreSQL のビルトイン関数、およびユーザー定義関数 (UDF) を含めることができます。

  • クエリ文には、ほとんどの集計関数とウィンドウ関数を含めることができます。

  • クエリ文にJOIN 操作が含まれている場合、INNER JOIN および OUTER JOIN (LEFTRIGHTFULLを含む) を使用してテーブルを結合できます。

  • クエリ文にOUTER JOIN 操作が含まれている場合、AND 演算子のみを使用してテーブルを結合できます。OR 演算子は使用できません。さらに、クエリ文には、等価条件で同じテーブルの列を含めることはできません。

  • 単純な文、FROM 句、およびUNION ALL 句のみがサポートされています。その他の句と共通テーブル式 (CTE) はサポートされていません。

ベーステーブルに基づいてリアルタイム マテリアライズドビューを作成した後、ベーステーブルで実行する DDL 文に次の制限が課されます。

  • ベーステーブルでTRUNCATE 文を実行する場合、リアルタイム マテリアライズドビューは同期的に更新されません。リアルタイム マテリアライズドビューを手動でリフレッシュするか、別のリアルタイム マテリアライズドビューを作成する必要があります。

  • DROP TABLE 文は、CASCADE オプションを指定した場合にのみ、ベーステーブルで実行できます。

  • ベーステーブルでALTER TABLE 文を実行する場合、マテリアライズドビューで参照されるベーステーブルのフィールドを削除または変更することはできません。

シナリオ

次の特性を持つシナリオでは、リアルタイム マテリアライズドビューを使用することをお勧めします。

  • リアルタイム マテリアライズドビューの増分更新機能とネストカスケード機能を使用して、依存関係を処理するための追加のスケジューリングシステムを必要とせずに、リアルタイム ETL ジョブを構築できます。ベーステーブルに基づいてリアルタイム マテリアライズドビューを作成し、次に、以前に作成したリアルタイム マテリアライズドビューに基づいて別のリアルタイム マテリアライズドビューを作成できます。このようにして、リアルタイム ワイドテーブルや集計などの ETL 処理結果がリアルタイムで生成され、データのクエリと分析が高速化されます。

  • リアルタイム マテリアライズドビューを使用すると、さまざまなシナリオでデータクエリを大幅に高速化できます。たとえば、クエリ結果にベーステーブルの少数の行または列のみが含まれている場合、またはクエリ結果を取得するために大量の計算が必要な場合などです。シナリオ例:

    • フィルター条件により、クエリ結果が効果的に絞り込まれます。

    • 集計関数により、値の大幅な集中またはグループ化が行われます。

    • 半構造化データが分析されます。

    • 集計操作の完了に長い時間がかかります。

  • ベーステーブルには大量の完全データが含まれており、増分データ更新の量は完全データの量よりもはるかに少なくなっています。

標準のマテリアライズドビューに適したすべてのシナリオで、リアルタイム マテリアライズドビューを使用できます。標準のマテリアライズドビューとは異なり、リアルタイム マテリアライズドビューのデータは、対応するベーステーブルのデータと高度に整合しています。ベーステーブルが変更されると、リアルタイム マテリアライズドビューはパフォーマンスコストを抑えて増分的に更新されます。ただし、ベーステーブルが変更されるたびに、データ整合性を確保するために、パフォーマンスコストの高い標準のマテリアライズドビューで完全更新を手動で実行する必要があります。リアルタイム マテリアライズドビューは、大幅なデータ変更またはストリーミング更新を伴うシナリオでは、標準のマテリアライズドビューよりもはるかに優れたパフォーマンスを発揮します。

リアルタイム マテリアライズドビューのデメリット

リアルタイム マテリアライズドビューは、リアルタイムで維持されるインデックスに似ています。リアルタイム マテリアライズドビューはクエリのパフォーマンスを大幅に最適化できますが、書き込みのパフォーマンスが低下する可能性があります。次の要素が、リアルタイム マテリアライズドビューの書き込みパフォーマンスに影響を与える可能性があります。

  • リアルタイム マテリアライズドビューの作成に使用されるクエリ文の複雑さとネスト レイヤーの数。単層リアルタイム マテリアライズドビューに単一のテーブルまたは単純なJOIN 操作が含まれる場合、インスタンス構成に基づいて、1 秒あたり数十万から数十万行を書き込むことができます。ネストされたリアルタイム マテリアライズドビューに複雑なJOIN 操作が含まれる場合、データ書き込みは大量のインスタンス計算リソースを消費し、パフォーマンスが比例的に低下します。

  • JOIN 操作。JOIN 操作を含むリアルタイム マテリアライズドビューは、書き込みの増幅につながる可能性があります。たとえば、リアルタイム マテリアライズドビューには、10 億行のデータを含むファクトテーブルと 10,000 行のデータを含むディメンションテーブル間のJOIN 操作が含まれます。ほとんどの場合、ファクトテーブルは高い書き込みパフォーマンスを実現します。ただし、ディメンションテーブルは、増分計算によって引き起こされる書き込みの増幅により、書き込みパフォーマンスが比例的に低下します。

  • AnalyticDB for PostgreSQL インスタンスのリソース量。リアルタイム マテリアライズドビューの増分計算と書き込み操作は、インスタンスリソースを消費します。インスタンスリソースの量は、リアルタイム マテリアライズドビューの書き込みパフォーマンスに影響します。書き込みパフォーマンスがビジネス要件を満たしていない場合は、計算リソースを増やしてパフォーマンスを向上させることができます。

リアルタイム マテリアライズドビューの作成または削除

  • 次のCREATE INCREMENTAL MATERIALIZED VIEW 文を実行して、mvという名前のリアルタイム マテリアライズドビューを作成します。

    CREATE INCREMENTAL MATERIALIZED VIEW mv AS SELECT * FROM base WHERE id > 40;
  • 次のDROP MATERIALIZED VIEW 文を実行して、mv マテリアライズドビューを削除します。

    DROP MATERIALIZED VIEW mv;

  1. ベーステーブルを作成します。

    CREATE TABLE test (a int, b int) USING HEAP DISTRIBUTED BY (a);
  2. リアルタイム マテリアライズドビューを作成します。

    CREATE INCREMENTAL MATERIALIZED VIEW mv AS SELECT * FROM TEST WHERE b > 40 DISTRIBUTED BY (a);
  3. ベーステーブルにデータを挿入します。

    INSERT INTO test VALUES (1, 30), (2, 40), (3, 50), (4, 60);
  4. ベーステーブルのデータを表示します。

    SELECT * FROM test;

    結果例:

     a | b
    ---+----
     1 | 30
     2 | 40
     3 | 50
     4 | 60
    (4 rows)
  5. マテリアライズドビューのデータを表示します。

    SELECT * FROM mv;

    マテリアライズドビューが更新されます。結果例:

     a | b
    ---+----
     3 | 50
     4 | 60
    (2 rows)