PolarDB for PostgreSQLでは、Elastic Parallel Query機能を使用して分析クエリを実行できるため、一部のハイブリッドトランザクション /分析処理 (HTAP) 機能を使用できます。 このトピックでは、この機能を使用して分析クエリのパフォーマンスを向上させる方法について説明します。
Elastic Parallel Query機能の仕組み
Elastic Parallel Queryでは、クエリは複数のノードで並列に実行されます。 クエリの実行方法を調整するノードは、クエリコーディネータ (QC) ノードと呼ばれ、他のノードは、並列実行 (PX) ノードと呼ばれる。 クエリ要求が開始された後、QCノードはクエリの実行プランをシャードに分割し、シャードをPXノードにルーティングします。 各PXノードは、実行プランの割り当てられた部分を実行し、クエリ結果をQCノードに送信します。 次いで、QCノードは、クエリ結果を集約する。

前の図では、RO1はQCノードであり、RO2、RO3、およびRO4はPXノードです。 RO1がクエリ要求を受信した後、RO1はクエリの実行プランを3つのシャードに分割し、シャードをRO2、RO3、およびRO4にルーティングします。 各PXノードは、実行プランの割り当てられた部分を実行し、共有ストレージシステムPolar File system (PolarFS) から必要なデータブロックを取得し、クエリ結果をQCノードに送信します。 次いで、QCノードは、クエリ結果を組み合わせ、最終結果を返す。
注意事項
各クエリを並列で実行するには、複数の読み取り専用ノードを使用する必要があるため、Elastic parallel queryは、実行頻度の低い分析クエリにのみ適しています。
パラメーター
デフォルトでは、Elastic Parallel Query機能は PolarDB for PostgreSQLで無効になっています。 この機能を使用するには、次の図に示すパラメーターを設定します。
パラメーター | Parameters |
polar_cluster_map | PolarDB for PostgreSQLのすべての読み取り専用ノードの名前を照会します。 このパラメーターは設定できません。 読み取り専用ノードを追加するたびに、パラメーターに返されるノード名のリストが自動的に更新されます。 説明 このパラメーターは、マイナーカーネルバージョン1.1.20 (1月2022日リリース) 以前を使用するクラスターでのみ使用できます。 |
polar_px_nodes | クエリが複数のノードで実行される読み取り専用ノードを指定します。 このパラメーターは既定では空です。これは、すべての読み取り専用ノードが並列実行に使用されることを示します。 並列実行に特定のノードを使用する場合は、使用するノードの名前にパラメーターを設定します。 ノード名はコンマ (,) で区切ります。 例:
|
polar_px_enable_replay_wait | 強い整合性を有効にするかどうかを指定します。 有効な値: onとoff。 PolarDB for PostgreSQLクラスターのプライマリノードと読み取り専用ノードの間に遅延があります。 たとえば、プライマリノードがCREATE TABLEステートメントを実行した後、読み取り専用ノードがプライマリノードと同期されるように、このDDLステートメントが読み取り専用ノードで再生されます。 このリプレイは遅延を引き起こします。 デフォルト値はオフです。これは、強い一貫性が無効になっていることを示します。 パラメーターをoffに設定すると、ログの再生によりプライマリノードと読み取り専用ノードの間に長い遅延が発生し、読み取り専用ノードがDDL操作の最新のログレコードの読み取りに失敗する可能性があります。 指定したデータベースロールに対して、このパラメーターをonに設定することもできます。 |
polar_px_max_workers_number | Elastic Parallel Queryのノードで実行できるワーカープロセスの最大数を指定します。 デフォルト値は 30 です。 このパラメーターは、各ノードの並列処理の程度を制限するために使用されます。 Elastic Parallel Queryのすべてのセッションの各ノードのワーカープロセスの数は、このパラメーターの値を超えることはできません。 |
polar_enable_px | Elastic Parallel Query機能を有効にするかどうかを指定します。 デフォルト値はoffで、この機能が無効になっていることを示します。 |
polar_px_dop_per_node | 現在のセッションでのElastic Parallel Queryの並列処理の度合いを指定します。 デフォルト値は 1 です。 オペレーティングシステムのコア数に値を設定することを推奨します。 polar_px_dop_per_nodeをNに設定すると、各ノードはセッションに対してN pxワーカープロセスを使用してクエリを並行して実行します。 |
px_workers | 指定したテーブルに機能を適用するかどうかを指定します。 デフォルトでは、この機能はテーブルに適用されません。 この機能は、コンピューティングリソースを消費します。 消費されるコンピューティングリソースを削減するために、このパラメーターを設定して、機能が適用されるテーブルを指定できます。 次のコードは、このパラメーターの設定方法を説明する例を示しています。 |
synchronous_commit | データベースがトランザクションをコミットしたときにクライアントに成功メッセージを返す前に、トランザクションがWALログがディスクに書き込まれるのを待つ必要があるかどうかを指定します。 デフォルト値 : on。 有効な値:
説明 パラメータは、PXモードでonに設定されます。 |
例
次のセクションでは、Elastic Parallel Query機能の効果について説明します。 この例では、単一テーブルクエリが実行されます。
背景情報
次のステートメントを実行してtestという名前のテーブルを作成し、テーブルにデータを挿入します。
CREATE TABLE test(id int);
INSERT INTO test SELECT generate_series(1,1000000);
EXPLAIN SELECT * FROM test;デフォルトでは、Elastic Parallel Query機能は無効になっています。 単一テーブルクエリのネイティブ実行計画では、次のコードに示すように、シーケンシャルスキャン (Seq scan) を実行します。
QUERY PLAN
--------------------------------------------------------
Seq Scan on test (cost=0.00..35.50 rows=2550 width=4)
(1 row)Elastic Parallel Query機能を有効にするには、次の手順を実行します。
testという名前のテーブルに対してこの機能を有効にします。
ALTER TABLE test SET (px_workers=1); SET polar_enable_px=on; EXPLAIN SELECT * FROM test;次のクエリ結果が返されます。
QUERY PLAN ------------------------------------------------------------------------------- PX Coordinator 2:1 (slice1; segments: 2) (cost=0.00..431.00 rows=1 width=4) -> Seq Scan on test (scan partial) (cost=0.00..431.00 rows=1 width=4) Optimizer: PolarDB PX Optimizer (3 rows)すべての読み取り専用ノードの名前を照会します。
実行するステートメントは、次のとおりです。
SHOW polar_cluster_map;次のクエリ結果が返されます。
polar_cluster_map ------------------- node1,node2,node3 (1 row)この例では、クラスターには、node1、node2、およびnode3の3つの読み取り専用ノードがあります。
Elastic Parallel Queryのnode1とnode2を指定します。
実行するステートメントは、次のとおりです。
SET polar_px_nodes='node1,node2';Elastic Parallel Queryに指定されたノードを照会します。
SHOW polar_px_nodes ;次のクエリ結果が返されます。
polar_px_nodes ---------------- node1,node2 (1 row)
パフォーマンスデータ
5つの読み取り専用ノードを使用して並列実行するテストから、次のパフォーマンスデータが得られます。
SELECT COUNT(*)をフルテーブルスキャンで実行すると、Elastic Parallel Queryはシングルノード並列実行の60倍の速度になります。TPC-Hクエリでは、Elastic Parallel Queryはシングルノード並列実行の30倍高速です。
説明この例では、TPC-Hベンチマークに基づくテストが実装されていますが、TPC-Hベンチマークテストのすべての要件を満たしているわけではありません。 したがって、テスト結果は、TPC-Hのベンチマークテストの公表された結果と比較できない可能性があります。