PolarDB for PostgreSQL (Oracle互換) は、マルチノードelastic parallel query (ePQ) をサポートしています。 この機能により、軽量の分析クエリを効率的に処理し、ハイブリッドトランザクション /分析処理 (HTAP) に対する需要の増加に対応できます。
概要
ePQをクエリに使用する場合、 PolarDB for PostgreSQL (Compatible with Oracle) はePQオプティマイザを使用して、複数の計算ノードで並列に実行できる実行プランを生成します。 ePQの実行エンジンは、複数の計算ノード上でのプランの実行を調整し、複数のノードのCPU、メモリ、およびI/O帯域幅を使用してデータをスキャンおよび計算します。
サーバーレスのエラスティックスケーリングを実現するには、Grand Unified Configuration (GUC) パラメーターを使用して、ePQに参加する計算ノードの数 (スケールアウト) と各ノードの並列処理の程度 (スケールアップ) を動的に調整できます。
使用上の注意
ePQは、PolarDB for PostgreSQL (Oracle 2.0と互換) では使用できません。
ePQの有効化
次のステートメントは、t1
という名前のテーブルのePQ機能を有効にします。 PolarDB PX Optimizer
がプランで返された場合、ePQは有効になります。
SET polar_enable_px = 1;
EXPLAIN SELECT * FROM t1;
QUERY PLAN
-------------------------------------------------------------------------------
PX Coordinator 6:1 (slice1; segments: 6) (cost=0.00..431.00 rows=1 width=8)
-> Partial Seq Scan on t1 (cost=0.00..431.00 rows=1 width=8)
Optimizer: PolarDB PX Optimizer
(3 rows)
SELECT * FROM t1;
GUCパラメータ
パラメーター | 説明 |
polar_enable_px | ePQ機能を有効にするかどうかを指定します。 有効な値:
説明 このパラメーターが [on] に設定されている場合、クエリは優先的にePQオプティマイザに送信され、複数の計算ノードで並行して実行できる実行プランが生成されます。 さらに、すべてのePQ関連のGUCパラメータが有効になります。 |
polar_px_nodes | ePQに参加する計算ノードの名前を指定します。 このパラメーターはデフォルトで空です。これは、すべての読み取り専用ノードがePQに参加していることを示します。 一部の読み取り専用ノードのみをePQに参加させる場合は、次のステートメントを実行して読み取り専用ノードの名前を取得できます。
取得したノード名にpolar_px_nodesを設定し、コンマ (,) で区切ります。
|
polar_px_dop_per_node | 現在のセッションの各計算ノードでePQに参加するワーカープロセスの数を指定します。 デフォルト値: 3。 説明 一般的なベストプラクティスとして、このパラメーターを現在のノードのCPUコア数の半分に設定することを推奨します。 現在のノードのCPU負荷が高い場合、CPU使用率が80% 以下に低下するまで、このパラメーターの値をデクリメントできます。 クエリのパフォーマンスが低い場合は、このパラメーターの値をインクリメントできます。 ただし、CPU使用率は80% を超えてはなりません。 そうしないと、システム内の他のバックグラウンドプロセスが遅くなる可能性があります。 |
polar_px_max_workers_number | 各計算ノードで同時に存在できるePQワーカープロセスの最大数を指定します。 デフォルト値: 30。 説明 計算ノード上のePQワーカープロセスの数がこの制限を超えると、クエリエラーが発生します。
この場合、このパラメーターの値を大きくして、同様のエラーを防ぐことができます。 このパラメーターを大きすぎる値に設定すると、ノード上に過剰なプロセスが存在し、メモリ不足 (OOM) エラーのリスクが高くなる可能性があります。 |
polar_px_wait_lock_timeout | ePQプロセスが同じリソースを使用する他のプロセスをブロックできる最大時間を指定します。 デフォルト値: 1800000 単位:ミリ秒。 (30分) ePQプロセスは通常、クエリ対象のテーブルの共有ロックを取得する読み取り専用クエリです。 ただし、一部のDDL操作ではテーブルの排他ロックが必要になるため、ロックの競合によりePQプロセスによって操作がブロックされます。 このパラメーターで指定された時間、DDL操作がブロックされると、ePQクエリがキャンセルされ、DDL操作を実行するプロセスのリソースが解放されます。 ePQは、時間のかかる分析クエリを実行するためによく使用されます。 したがって、 |
synchronous_commit | エラスティック並列クエリでデータの一貫性を確保するかどうかを指定します。 有効な値:
|
ベストプラクティス
特定のテーブルにePQの使用を許可
特定のテーブルでのみePQを実行する場合は、polar_px_enable_check_workers
をonに設定します。 また、ePQを実行するテーブルにpx_workers
オプションを明示的に設定する必要があります。
ALTER TABLE t1 SET (px_workers = 1);
px_workers
の有効な値:
-1
: テーブルのePQを無効にします。0
(デフォルト): テーブルのePQを無視します。1
: テーブルでePQを有効にします。
ePQ機能の有効化
グローバルレベル
PolarDBコンソールで、polar_enable_px
をon
に設定し、ePQをグローバルに有効にします。 デフォルトでは、ePQはトランザクションクエリと分析クエリの両方に使用されます。
次のサンプルSQL文を使用して、実行計画を表示します。 PolarDB PX Optimizer
がプランで返された場合、ePQは有効になります。
=> EXPLAIN SELECT * FROM t1;
QUERY PLAN
-------------------------------------------------------------------------------
PX Coordinator 6:1 (slice1; segments: 6) (cost=0.00..431.00 rows=1 width=8)
-> Partial Seq Scan on t1 (cost=0.00..431.00 rows=1 width=8)
Optimizer: PolarDB PX Optimizer
(3 rows)
セッションレベル
セッション内で実行されるすべてのクエリのePQを有効にするには、 polar_enable_px
をON
に設定します。
SET polar_enable_px = ON;
データベースレベルとユーザーレベル
ePQがグローバルまたはセッションレベルで有効になった後、システムは他の実行メソッドを使用する前に、並列実行の対象となるすべてのクエリに対して自動的にePQを使用します。 ベストプラクティスの観点から、ePQは、短いトランザクションクエリよりも、分析ワークロードが重い長いクエリに適しています。 短いクエリの場合、接続の確立、データの交換、およびePQの使用中の計算ノード間の接続の破壊に関連するオーバーヘッドは、クエリのパフォーマンスを低下させる可能性があります。
特定のビジネスニーズにePQが必要な場合、ePQを必要とする分析SQLクエリをメインデータベースから抽出し、ePQクエリ用に構成された別のデータベースで実行できます。
ALTER DATABASE ap_database SET polar_enable_px = ON;
または、特定のアカウントを使用して、ePQを必要とする分析SQLクエリを実行できます。
ALTER ROLE ap_role SET polar_enable_px = ON;
クエリレベル
夜間のレポートタスクなど、セッション内の特定のクエリにのみePQを使用する場合は、pg_hint_plan
プラグインとSQLヒントを使用して、これらのクエリのePQを有効にします。 SQLヒントを機能させるには、pg_hint_plan
プラグインがGUCパラメーターshared_preload_libraries
に追加されていることを確認します。
Prepend /* + PX() */
to a query to enable ePQ for the query.
=> /*+ PX() */ EXPLAIN SELECT * FROM t1;
QUERY PLAN
----------------------------------------------------------------------------------
PX Coordinator 6:1 (slice1; segments: 6) (cost=0.00..431.03 rows=1000 width=8)
-> Partial Seq Scan on t1 (cost=0.00..431.00 rows=167 width=8)
Optimizer: PolarDB PX Optimizer
(3 rows)
Prepend /* + NoPX() */
をクエリに追加して、クエリのePQを無効にします。
=> /*+ NoPX() */ EXPLAIN SELECT * FROM t1;
QUERY PLAN
------------------------------------------------------
Seq Scan on t1 (cost=0.00..15.00 rows=1000 width=8)
(1 row)
前払い/* + PX(N) * /
へ単一ノードの並列処理でePQを有効にするクエリN
. 次の例では、の値 N
は6
.
=> /*+ PX(6) */ EXPLAIN SELECT * FROM t1;
QUERY PLAN
------------------------------------------------------------------------------------
PX Coordinator 12:1 (slice1; segments: 12) (cost=0.00..431.02 rows=1000 width=8)
-> Partial Seq Scan on t1 (cost=0.00..431.00 rows=84 width=8)
Optimizer: PolarDB PX Optimizer
(3 rows)