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 * からt1;
クエリ計画
-------------------------------------------------------------------------------
PXコーディネーター6:1 (slice1; セグメント: 6) (コスト=0.00 .. 431.00行=1幅=8)
-> t1の部分Seqスキャン (コスト=0.00 .. 431.00行=1幅=8)
Optimizer: PolarDB PX Optimizer
(3行)
SELECT * から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 * からt1;
クエリ計画
-------------------------------------------------------------------------------
PXコーディネーター6:1 (slice1; セグメント: 6) (コスト=0.00 .. 431.00行=1幅=8)
-> t1の部分Seqスキャン (コスト=0.00 .. 431.00行=1幅=8)
Optimizer: PolarDB PX Optimizer
(3行) セッションレベル
セッション内で実行されるすべてのクエリの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;
クエリ計画
----------------------------------------------------------------------------------
PXコーディネーター6:1 (slice1; セグメント: 6) (コスト=0.00 .. 431.03行=1000幅=8)
-> t1の部分Seqスキャン (コスト=0.00 .. 431.00行=167幅=8)
Optimizer: PolarDB PX Optimizer
(3行) Prepend /* + NoPX() */ をクエリに追加して、クエリのePQを無効にします。
=> /* + NoPX() */ EXPLAIN SELECT * からt1;
クエリ計画
------------------------------------------------------
t1のSeqスキャン (コスト=0.00 .. 15.00行=1000幅=8)
(1行) 前払い/* + PX(N) * / へ単一ノードの並列処理でePQを有効にするクエリN. 次の例では、の値 Nは6.
=> /* + PX (6) */ EXPLAIN SELECT * からt1;
クエリ計画
------------------------------------------------------------------------------------
PXコーディネーター12:1 (slice1; セグメント: 12) (コスト=0.00 .. 431.02行=1000幅=8)
-> t1の部分Seqスキャン (コスト=0.00 .. 431.00行=84幅=8)
Optimizer: PolarDB PX Optimizer
(3行)