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

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

最終更新日:Jun 11, 2025

このトピックでは、PolarDB for PostgreSQL クラスタのリアルタイム マテリアライズドビュー機能について説明します。

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

リアルタイム マテリアライズドビューをサポートするには、PolarDB for PostgreSQL クラスタが次のデータベースエンジン バージョンのいずれかを実行している必要があります。

  • PolarDB for PostgreSQL 14 (リビジョンバージョン 2.0.14.8.11.0 以降)

  • PolarDB for PostgreSQL 11 (リビジョンバージョン 2.0.11.9.27.0 以降)

説明

PolarDB コンソールで、または SHOW polardb_version; 文を実行することで、クラスタのリビジョンバージョンを表示できます。リビジョンバージョンが要件を満たしていない場合は、スペックアップしてください。

背景情報

一般的なビューとは異なり、マテリアライズドビューはクエリ結果を格納できます。 複雑なクエリシナリオでは、マテリアライズドビューを使用してクエリ結果を保存することで、クエリ効率を大幅に向上させることができます。 ただし、マテリアライズドビューのデータは、ベーステーブルのデータによって変化することはありません。 つまり、マテリアライズドビューを使用してクエリを実行する場合、常に最新のデータを取得できるとは限りません。

この問題に対処するために、PolarDB はリアルタイム マテリアライズドビューの概念を導入しました。 マテリアライズドビューと比較して、リアルタイム マテリアライズドビューには次の利点があります。

  • リアルタイム マテリアライズドビューは、文レベルの更新をサポートしています。 ベーステーブルで DML 文 (INSERT、DELETE、UPDATE) が実行されると、マテリアライズドビューのデータが自動的に更新され、ベーステーブルのデータとの整合性が維持されます。

  • リアルタイム マテリアライズドビューは、ベーステーブルの増分データを最大限に活用します。 マテリアライズドビューをリフレッシュすると、マテリアライズドビューのすべてのデータがクエリされます。 マテリアライズドビューを頻繁にリフレッシュするよりも、リアルタイム マテリアライズドビューの方がパフォーマンスが向上します。

  • リアルタイム マテリアライズドビューは、クエリのパフォーマンスを大幅に向上させ、ベーステーブルとのデータ整合性を確保できます。

用語

  • ベーステーブル: マテリアライズドビューの定義で使用される一般的なテーブル。

  • デルタ: ベーステーブルのデータが変更されたときに追加または削除されるデータのコレクション (マテリアライズドビューのデータと比較)。

  • リフレッシュ: マテリアライズドビューを維持して、マテリアライズドビューのデータが、ビュー定義に基づいて現在のベーステーブルをクエリすることによって取得されたデータと一致するようにします。

  • デルタの適用: リアルタイム マテリアライズドビューから計算された増分データを挿入または削除して、リアルタイム マテリアライズドビューとベーステーブル間のデータ整合性を維持します。

制限事項

リアルタイム マテリアライズドビューには、次の制限があります。

  • ベーステーブルは、パーティションテーブルまたは継承テーブルではなく、一般的なテーブルである必要があります。

  • INNER JOIN のみがサポートされています。 その他の JOIN タイプはサポートされていません。

  • immutable 関数のみがサポートされています。

  • 単純なクエリ、射影、DISTINCT、および特定の集計関数を含むビュー定義のみがサポートされています。 複雑なクエリを含むビュー定義はサポートされていません。 複雑なクエリには、サブクエリ、[NOT] EXISTS[NOT] INLIMITHAVINGDISTINCT ONWITH(CTE)ORDER BY、ウィンドウ関数、GROUPING SETSCUBEROLLUPUNIONINTERSECTEXCEPT が含まれます。

  • GROUP BY 句を使用する場合、GROUP BY 句で指定されたグループは射影に含まれている必要があります。

  • サポートされている組み込み集計関数は、MINMAXSUMAVGCOUNT のみです。

パフォーマンスの低下

  • リアルタイム マテリアライズドビューはクエリのパフォーマンスを大幅に向上させますが、ベーステーブルの書き込みパフォーマンスに大きな影響を与えます。 読み取り操作の数の方が書き込み操作の数よりも多い場合は、リアルタイム マテリアライズドビューを使用することをお勧めします。

  • リアルタイム マテリアライズドビューがベーステーブルの書き込みパフォーマンスに与える影響は、ビュー定義、書き込み負荷、ベーステーブルの構造、インデックスなどの要因によって異なります。 本番環境でリアルタイム マテリアライズドビューを作成する前に、まずテスト環境でリアルタイム マテリアライズドビューがベーステーブルの書き込みパフォーマンスに与える影響をテストすることをお勧めします。 書き込みパフォーマンスが要件を満たしている場合は、本番環境でリアルタイム マテリアライズドビューを使用できます。

  • リアルタイム マテリアライズドビューのコストを削減するには、次の方法を使用できます。

    • 同じベーステーブルに少数のリアルタイム マテリアライズドビューを作成します。

    • データをベーステーブルにバッチ書き込みします。 たとえば、COPY 文または INSERT INTO SELECT 文を実行して、データをバッチ インポートできます。

    • すべてのベーステーブルのプライマリキーを作成し、リアルタイム マテリアライズドビューの定義の射影された列にすべてのベーステーブルのプライマリキーを含めます。

仕組み

  • [リアルタイム マテリアライズドビューの作成]

    • マテリアライズドビューのクエリを書き直して、リアルタイム マテリアライズドビューの維持に必要な非表示の列を計算します。

    • リアルタイム マテリアライズドビューをリフレッシュするためのトリガーをベーステーブルに作成します。

    • 指定された条件が満たされたときにリアルタイム マテリアライズドビューに一意なインデックスを作成して、デルタリフレッシュを高速化します。

  • [リアルタイム マテリアライズドビューのリフレッシュ]

    • ベーステーブルのデータ変更によってトリガーがアクティブになります。

    • トリガーを使用して、ベーステーブルから増分データを取得します。

    • 現在のベーステーブルの定義と増分データに基づいて、リアルタイム マテリアライズドビューのデルタを計算します。

    • 計算された増分データをリアルタイム マテリアライズドビューに適用して、デルタリフレッシュを実装します。

  • [リアルタイム マテリアライズドビューの削除]

    • リアルタイム マテリアライズドビューのベーステーブルからデルタリフレッシュトリガーを削除します。

    • リアルタイム マテリアライズドビューを削除します。

使用上の注意

  • 前提条件

    リアルタイム マテリアライズドビューを使用するには、データベースに polar_ivm 拡張機能を作成します。

    CREATE EXTENSION polar_ivm WITH SCHEMA pg_catalog;
  • [リアルタイム マテリアライズドビューの作成]

    CREATE MATERIALIZED VIEW table_name[ (column_name [, ...] ) ]
    REFRESH FAST
    ON COMMIT
    AS query
    [ WITH [ NO ] DATA ]

    次の表にパラメーターを示します。

    パラメータ

    説明

    table_name

    作成するリアルタイム マテリアライズドビューの名前。スキーマ修飾できます。

    column_name

    リアルタイム マテリアライズドビューの列の名前。列名を指定しない場合、マテリアライズドビューは AS 句で指定されたクエリの結果セットの列名を使用します。

    WITH DATA

    ビューの作成後すぐにデータを設定します。これはデフォルトのオプションです。

    WITH NO DATA

    ビューを作成しますが、最初の更新時など、データの設定は後で実行されます。

    ビューをクエリしてもエラーは報告されません。ただし、ビューに対して REFRESH MATERIALIZED VIEW 文を実行するまで、データは返されません。

    query

    結果がマテリアライズドビューに格納される SQL クエリ。SELECT、TABLE、または VALUES 文を指定できます。クエリは安全で制限された操作で実行されます。

  • [リアルタイム マテリアライズドビューの増分リフレッシュ]

    REFRESH MATERIALIZED VIEW table_name
    説明

    • table_name: リフレッシュするリアルタイム マテリアライズドビューの名前。

    • WITH DATA パラメーターを使用して作成されたリアルタイム マテリアライズドビューを手動でリフレッシュする必要はありません。

    • WITH NO DATA パラメーターを使用して作成されたリアルタイム マテリアライズドビューをリフレッシュすると、ビュー定義に基づいてビューにデータが設定され、ベーステーブルに対する後続の変更がリアルタイムでビューに更新されます。

  • [リアルタイム マテリアライズドビューの削除]

    DROP MATERIALIZED VIEW [ IF EXISTS ] table_name [, ...] [ CASCADE | RESTRICT ]

    次の表にパラメーターを示します。

    パラメーター

    説明

    IF EXISTS

    リアルタイム マテリアライズドビューが存在しない場合、エラーではなくプロンプトが返されます。

    table_name

    削除するリアルタイム マテリアライズドビューの名前。スキーマ修飾できます。

    CASCADE

    ビューに依存するオブジェクト (他のマテリアライズドビューや標準ビューなど) と、自動的に削除されたオブジェクトに依存するすべてのオブジェクトを自動的に削除します。

    RESTRICT

    オブジェクトがリアルタイム マテリアライズドビューに依存している場合、ビューは削除されません。 デフォルトでは、このパラメーターが使用されます。

  1. polar_ivm 拡張機能をインストールします。

    CREATE EXTENSION IF NOT EXISTS polar_ivm WITH SCHEMA pg_catalog ;
  2. ベーステーブルを作成し、テーブルにデータを挿入します。

    CREATE TABLE t( a INT, b VARCHAR);
    INSERT INTO t VALUES
      (1,'a'),
      (2,'b'),
      (3,'c'),
      (4,'d'),
      (5,'e');
  3. リアルタイム マテリアライズドビューを作成します。

    CREATE MATERIALIZED VIEW mv
    REFRESH FAST
    ON COMMIT
    AS
    SELECT max(a),min(a),b FROM t GROUP BY b;
  4. ベーステーブルで DML 文を実行します。

    • リアルタイム マテリアライズドビューのデータをクエリします。

      SELECT * FROM mv ORDER BY b;

      結果例:

       max | min | b
      -----+-----+---
         1 |   1 | a
         2 |   2 | b
         3 |   3 | c
         4 |   4 | d
         5 |   5 | e
      (5 rows)

      この結果から、リアルタイム マテリアライズドビューのデータがベーステーブルのデータと一致していることがわかります。

    • 新しいデータをベーステーブルに挿入し、リアルタイム マテリアライズドビューのデータをクエリします。

      INSERT INTO t VALUES(6,'f');
      
      SELECT * FROM mv ORDER BY b;

      結果例:

       max | min | b
      -----+-----+---
         1 |   1 | a
         2 |   2 | b
         3 |   3 | c
         4 |   4 | d
         5 |   5 | e
         6 |   6 | f
      (6 rows)

      この結果から、リアルタイム マテリアライズドビューのデータがベーステーブルのデータと一致していることがわかります。

    • ベーステーブルから特定のデータを削除し、リアルタイム マテリアライズドビューのデータをクエリします。

      DELETE FROM t WHERE a = 2;
      
      SELECT * FROM mv ORDER BY b;

      結果例:

       max | min | b
      -----+-----+---
         1 |   1 | a
         3 |   3 | c
         4 |   4 | d
         5 |   5 | e
         6 |   6 | f
      (5 rows)

      この結果から、リアルタイム マテリアライズドビューのデータがベーステーブルのデータと一致していることがわかります。

    • ベーステーブルのデータを更新し、リアルタイム マテリアライズドビューのデータをクエリします。

      UPDATE t SET a = a + 1;
      
      SELECT * FROM mv ORDER BY b;

      結果例:

       max | min | b
      -----+-----+---
         2 |   2 | a
         4 |   4 | c
         5 |   5 | d
         6 |   6 | e
         7 |   7 | f
      (5 rows)

      この結果から、リアルタイム マテリアライズドビューのデータがベーステーブルのデータと一致していることがわかります。

  5. リアルタイム マテリアライズドビューを削除します。

    DROP MATERIALIZED VIEW mv;