このトピックでは、 PolarDB for PostgreSQLのリアルタイムマテリアライズビューについて説明します。
前提条件
PolarDB for PostgreSQLクラスターは、次のエンジンを実行します。
PostgreSQL 14 (バージョン14.8.11.0以降)
PostgreSQL 11 (バージョン1.1.27以降)
次のいずれかのステートメントを実行して、PolarDB for PostgreSQLクラスターのマイナーバージョンを表示できます。
PostgreSQL 14
select version();
PostgreSQL 11
ショーpolar_version;
背景情報
一般的なビューとは異なり、マテリアライズドビューはクエリ結果を格納できます。 複雑なクエリシナリオでは、マテリアライズドビューを使用してクエリ結果を保存すると、クエリ効率が大幅に向上します。 ただし、具体化されたビューのデータは、ベーステーブルのデータによって変化しません。 つまり、クエリにマテリアライズドビューを使用すると、常に最新の結果が得られるとは限りません。
この問題に対処するために、PolarDBはリアルタイムマテリアライズドビューの概念を導入しています。 マテリアライズドビューと比較して、リアルタイムマテリアライズドビューには次の利点があります。
リアルタイムマテリアライズドビューは、ステートメントレベルの更新をサポートします。 DMLステートメント (INSERT、DELETE、およびUPDATE) がベーステーブルで実行された後、マテリアライズドビューのデータは、ベーステーブルのデータとの一貫性を保つように自動的に更新されます。
リアルタイムマテリアライズドビューは、ベーステーブルの増分データを最大限に活用します。 マテリアライズドビューを更新すると、マテリアライズドビュー内のすべてのデータが照会されます。 マテリアライズドビューの頻繁な更新と比較して、リアルタイムマテリアライズドビューはより良いパフォーマンスを提供します。
リアルタイムマテリアライズドビューは、クエリのパフォーマンスを大幅に向上させ、ベーステーブルとのデータ整合性を確保します。
用語
ベーステーブル: マテリアライズド・ビューの定義で使用される共通テーブル。
デルタ: マテリアライズドビューのデータと比較して、ベーステーブルのデータが変更されたときに追加または削除されるデータのコレクション。
更新: 具体化されたビューのデータが、ビュー定義に基づいて現在のベーステーブルを照会して取得したデータと一致するように、具体化されたビューを維持します。
デルタの適用: 計算された増分データをリアルタイムマテリアライズドビューに挿入または削除して、リアルタイムマテリアライズドビューとベーステーブル間のデータの整合性を維持します。
制限事項
リアルタイムのマテリアライズドビューには、次の制限があります。
ベーステーブルは、パーティションテーブルまたは継承テーブルではなく、共通テーブルである必要があります。
INNER JOIN
のみがサポートされています。 その他のJOIN
タイプはサポートされていません。可変
関数のみがサポートされています。単純なクエリ、プロジェクション、
DISTINCT
、および特定の集計関数を含むビュー定義のみがサポートされています。 複雑なクエリを含むビュー定義はサポートされていません。 複合クエリは、サブクエリ、[NOT] EXISTS
、[NOT] IN
、LIMIT
、HAVING
、DISTINCT ON
、WITH(CTE)
、ORDER BY
、ウィンドウ関数、GROUPING SETS
、CUBE
、ROLLUP
、UNION
、INTERECT
、およびEXCEPT
を含む。GROUP BY
句を使用する場合、group BY
句で指定したグループが投影内にある必要があります。MIN
、MAX
、SUM
、AVG
、およびCOUNT
の組み込み関数のみがサポートされています。
パフォーマンスの低下
リアルタイムマテリアライズドビューはクエリのパフォーマンスを大幅に向上させますが、ベーステーブルの書き込みパフォーマンスに大きな影響を与えます。 読み取り操作の数が書き込み操作の数よりも多い場合は、リアルタイムのマテリアライズドビューを使用することを推奨します。
ベーステーブルの書き込みパフォーマンスに対するリアルタイムマテリアライズドビューの影響は、ベーステーブルのビュー定義、書き込みロード、構造、インデックスなどの要因によって異なります。 実稼働環境でリアルタイムマテリアライズドビューを作成する前に、まず、テスト環境での実テーブルの書き込みパフォーマンスに対するリアルタイムマテリアライズドビューの影響をテストすることをお勧めします。 書き込みパフォーマンスが要件を満たしている場合は、実稼働環境でリアルタイムマテリアライズドビューを使用できます。
リアルタイムのマテリアライズドビューのコストを削減するには、次の方法を使用できます。
同じベーステーブルにいくつかのリアルタイムマテリアライズドビューを作成します。
ベーステーブルへのデータの一括書き込み。 たとえば、
COPY
またはINSERT INTO SELECT
ステートメントを実行して、データを一括インポートできます。すべてのベーステーブルの主キーを作成し、すべてのベーステーブルの主キーをリアルタイムマテリアライズドビューの定義の投影列に含めます。
制御ポリシー機能の動作
リアルタイムマテリアライズドビューの作成
マテリアライズドビューのクエリを書き換え、リアルタイムマテリアライズドビューを維持するために必要な非表示列を計算します。
実時間マテリアライズドビューを更新するために、ベーステーブルのトリガーを作成します。
指定された条件が満たされたときに、リアルタイムマテリアライズドビューの一意のインデックスを作成して、デルタ更新を高速化します。
リアルタイムマテリアライズドビューの更新
ベーステーブルのデータ変更により、トリガーがアクティブになります。
トリガーを使用して、ベーステーブルから増分データを取得します。
現在のベーステーブルの定義と増分データに基づいて、リアルタイムマテリアライズドビューのデルタを計算します。
計算された増分データをリアルタイムマテリアライズドビューに適用して、デルタリフレッシュを実装します。
リアルタイムマテリアライズドビューの削除
リアルタイムマテリアライズドビューのベーステーブルからデルタ更新トリガーを削除します。
リアルタイムマテリアライズドビューを削除します。
使用上の注意
前提条件
クラスターのリアルタイムマテリアライズドビューを作成する前に、クラスターのマイナーエンジンバージョンを1.1.27に更新し、クラスターに
polar_ivm
プラグインを作成する必要があります。SCHEMA pg_catalogで拡張polar_ivmを作成します。
説明次のステートメントを実行して、PolarDB for PostgreSQLクラスターのマイナーバージョンを照会できます。
ショーpolar_version;
リアルタイムマテリアライズドビューの作成
作成MATERIALIZED VIEW table_name[ (column_name [, ...] ) ] 早くリフレッシュ コミット中 ASクエリ [[いいえ] データ付き]
下表に、各パラメーターを説明します。
パラメーター
説明
table_name
リアルタイムマテリアライズドビューの名前。スキーマ修飾できます。
column_name
リアルタイムマテリアライズドビューの列の名前。 列名が指定されていない場合は、照会された列名から取得されます。
データ付き
デフォルトのオプション。 完全なリアルタイムのマテリアライズドビューがすぐに作成されます。
WITH NO DATA
リアルタイムマテリアライズドビューの構造のみが作成され、データは入力されません。 リアルタイムマテリアライズドビューでは、リアルタイムリフレッシュは実行されない。
リアルタイムマテリアライズドビューをクエリすると、
REFRESH materialized view
ステートメントがリアルタイムマテリアライズドビューで実行される前にエラーが報告されます。query
リアルタイムマテリアライズドビューの定義。SELECTステートメント、TABLE式、またはVALUES式を使用できます。 クエリは、安全で制限された操作内で実行されます。
リアルタイムマテリアライズドビューの更新
REFRESH MATERIALIZED VIEWテーブル_名
説明table_name: リアルタイムマテリアライズドビューの名前。
WITH DATA
パラメーターを使用して作成されたリアルタイムマテリアライズドビューの場合、ビューとベーステーブル間のデータの一貫性を確保するために手動で更新する必要はありません。WITH NO DATA
パラメーターを使用して作成されたリアルタイムマテリアライズドビューの場合、手動更新は定義に基づいてデータを生成し、ベーステーブルのその後の変更のためのリアルタイム更新を可能にします。
リアルタイムマテリアライズドビューの削除
ドロップ素材化ビュー [存在しない場合] table_name [, ...] [カスケード | 制限]
下表に、各パラメーターを説明します。
パラメーター
説明
IF EXISTS
リアルタイムマテリアライズドビューが存在しない場合、エラーではなくプロンプトが返されます。
table_name
リアルタイムマテリアライズドビューの名前。スキーマ修飾できます。
CASCADE
他のマテリアライズドビューや通常のビューなど、リアルタイムマテリアライズドビューに依存するオブジェクトは自動的に削除され、自動的に削除されたオブジェクトに依存するすべてのオブジェクトが削除されます。
RESTRICT
いずれかのオブジェクトがリアルタイムマテリアライズドビューに依存している場合、リアルタイムマテリアライズドビューは削除されません。 このパラメーターは、デフォルトで選択されています。
性能テスト
リアルタイムマテリアライズドビューの依存関係プラグインを作成します。
SCHEMA pg_catalogでpolar_ivmが存在しない場合は拡張を作成します。
ベーステーブルを作成し、テーブルにデータを入力します。
CREATE TABLE t( a INT, b VARCHAR); t値に挿入する (1、'a') 、 (2、'b') 、 (3、'c') 、 (4、'd') 、 (5,'e');
リアルタイムマテリアライズドビューを作成します。
MATERIALIZED VIEW mvを作成する 早くリフレッシュ コミット中 AS SELECT max(a) 、min(a) 、b FROM t GROUP BY b;
ベーステーブルでDMLステートメントを実行します。
リアルタイムマテリアライズドビューのデータを照会します。
SELECT * からmv ORDER BY b;
サンプル結果:
max | min | b ----- ----- ----- 1 | 1 | a 2 | 2 | b 3 | 3 | c 4 | 4 | d 5 | 5 | e (5行)
結果は、リアルタイムマテリアライズドビューのデータがベーステーブルのデータと一致していることを示しています。
新しいデータをベーステーブルに挿入し、リアルタイムマテリアライズドビューのデータを照会します。
はt値に挿入します (6、'f'); SELECT * から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行)
結果は、リアルタイムマテリアライズドビューのデータがベーステーブルのデータと一致していることを示しています。
実テーブルのデータを削除し、リアルタイムマテリアライズドビューのデータを照会します。
a = 2の場所から削除します。SELECT * からmv ORDER BY b;
サンプル結果:
max | min | b ----- ----- ----- 1 | 1 | a 3 | 3 | c 4 | 4 | d 5 | 5 | e 6 | 6 | f (5行)
結果は、リアルタイムマテリアライズドビューのデータがベーステーブルのデータと一致していることを示しています。
ベーステーブルのデータを更新し、リアルタイムマテリアライズドビューのデータを照会します。
UPDATE t SET a = a + 1; SELECT * からmv ORDER BY b;
サンプル結果:
max | min | b ----- ----- ----- 2 | 2 | a 4 | 4 | c 5 | 5 | d 6 | 6 | e 7 | 7 | f (5行)
結果は、リアルタイムマテリアライズドビューのデータがベーステーブルのデータと一致していることを示しています。
リアルタイムマテリアライズドビューを削除します。
ドロップ素材化ビューmv;