このトピックでは、マテリアライズドビュー作成におけるノード間並列高速化機能について説明します。
適用範囲
この機能は、以下のバージョンの PolarDB for PostgreSQL で利用できます。
マイナーエンジンバージョンが 2.0.14.6.6.0 以降の PostgreSQL 14
マイナーエンジンバージョンが 2.0.11.9.30.0 以降の PostgreSQL 11
コンソールで、または SHOW polardb_version; ステートメントを実行して、マイナーエンジンバージョン番号を表示できます。マイナーエンジンバージョンが要件を満たしていない場合は、マイナーエンジンバージョンをアップグレードしてください。
背景情報
マテリアライズドビューは、クエリ結果を含むデータベースオブジェクトです。通常のビューとは異なり、マテリアライズドビューは、その定義と作成時のデータのコピーの両方を格納します。マテリアライズドビュー内のデータがビュー定義内のデータと一致しない場合は、マテリアライズドビューをリフレッシュして一貫性を維持できます。マテリアライズドビューは、本質的に、後で再利用するためにその定義内のクエリを事前に計算します。
CREATE TABLE AS 構文は、クエリの結果から新しいテーブルを作成します。新しいテーブルのスキーマは、クエリの出力列と同じです。
SELECT INTO 構文は、新しいテーブルを作成し、クライアントにデータを返す代わりにクエリ結果を書き込みます。新しいテーブルのスキーマは、クエリの出力列と同じです。
仕組み
PostgreSQL カーネルは、マテリアライズドビューの作成とリフレッシュ、および CREATE TABLE AS と SELECT INTO 構文を使用するステートメントを処理するために同じロジックを使用します。これは、これらの操作がすべてデータベースレベルで同様のステップを実行するためです。このプロセスは、主に次の 2 つのステップで構成されます。
データスキャン:ビュー、
CREATE TABLE ASステートメント、またはSELECT INTOステートメントで定義されたクエリを実行して、一致するデータをスキャンします。データ書き込み:スキャンしたデータを新しいマテリアライズドビューまたはテーブルに書き込みます。
PolarDB for PostgreSQL は、データスキャンステップの最適化として ePQ 並列スキャンを導入しています。大量のデータをスキャンする必要がある場合、この最適化により、データ定義言語 (DDL) ステートメントのパフォーマンスが大幅に向上し、実行時間が短縮されます。
ePQ 並列スキャン:ePQ 機能は、複数のコンピュートノードの I/O 帯域幅とコンピューティングリソースを使用して、ビュー定義内のクエリを並列で実行します。これにより、コンピューティングリソースと帯域幅の両方の使用率が向上します。
バッチ書き込み:スキャンされた各タプルをテーブルまたはマテリアライズドビューに個別に書き込む代わりに、タプルはメモリに蓄積され、単一のバッチで書き込まれます。これにより、先行書き込みログ (WAL) の記録のオーバーヘッドが削減され、ページロックの頻度が低下します。
使用方法
polar_px_enable_create_table_as パラメーターを設定して、CREATE TABLE AS ステートメントのクエリプロセスを高速化するために ePQ 並列スキャンを有効または無効にすることができます。有効な値は次のとおりです。
ON (デフォルト):
CREATE TABLE ASステートメントに対して ePQ 並列スキャンを有効にします。OFF:
CREATE TABLE ASステートメントに対して ePQ 並列スキャンを無効にします。
SET polar_px_enable_create_table_as = ON;このパラメーターは、ePQ 機能が有効になっている (
polar_enable_pxパラメーターが ON に設定されている) 場合にのみ有効です。ePQ 機能の制限により、この最適化は
CREATE TABLE AS ... WITH OIDS構文をサポートしていません。この構文を使用するステートメントの場合、システムは組み込みの PostgreSQL オプティマイザーにフォールバックして実行計画を生成します。その後、クエリは PostgreSQL エグゼキュータによってシングルノードで実行されます。