すべてのプロダクト
Search
ドキュメントセンター

PolarDB:ベストプラクティス

最終更新日:Sep 29, 2024

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

  • off (デフォルト)

説明

このパラメーターが [on] に設定されている場合、クエリは優先的にePQオプティマイザに送信され、複数の計算ノードで並行して実行できる実行プランが生成されます。 さらに、すべてのePQ関連のGUCパラメータが有効になります。

polar_px_nodes

ePQに参加する計算ノードの名前を指定します。 このパラメーターはデフォルトで空です。これは、すべての読み取り専用ノードがePQに参加していることを示します。

一部の読み取り専用ノードのみをePQに参加させる場合は、次のステートメントを実行して読み取り専用ノードの名前を取得できます。

=> CREATE EXTENSION polar_monitor;
CREATE EXTENSION

=> SELECT name,slot_name,type FROM polar_cluster_info WHERE type = 'Replica';
 name  | slot_name |  type
-------+-----------+---------
 node2 | replica1  | Replica
 node3 | replica2  | Replica
(2 rows)

取得したノード名にpolar_px_nodesを設定し、コンマ (,) で区切ります。

=> SET polar_px_nodes = 'node2,node3';
=> SHOW polar_px_nodes;
 polar_px_nodes
----------------
 node2,node3
(1 row)

polar_px_dop_per_node

現在のセッションの各計算ノードでePQに参加するワーカープロセスの数を指定します。 デフォルト値: 3。

説明

一般的なベストプラクティスとして、このパラメーターを現在のノードのCPUコア数の半分に設定することを推奨します。 現在のノードのCPU負荷が高い場合、CPU使用率が80% 以下に低下するまで、このパラメーターの値をデクリメントできます。 クエリのパフォーマンスが低い場合は、このパラメーターの値をインクリメントできます。 ただし、CPU使用率は80% を超えてはなりません。 そうしないと、システム内の他のバックグラウンドプロセスが遅くなる可能性があります。

polar_px_max_workers_number

各計算ノードで同時に存在できるePQワーカープロセスの最大数を指定します。 デフォルト値: 30。

説明

計算ノード上のePQワーカープロセスの数がこの制限を超えると、クエリエラーが発生します。

ERROR:  over px max workers, already xxx workers, max 30 workers

この場合、このパラメーターの値を大きくして、同様のエラーを防ぐことができます。 このパラメーターを大きすぎる値に設定すると、ノード上に過剰なプロセスが存在し、メモリ不足 (OOM) エラーのリスクが高くなる可能性があります。

polar_px_wait_lock_timeout

ePQプロセスが同じリソースを使用する他のプロセスをブロックできる最大時間を指定します。 デフォルト値: 1800000 単位:ミリ秒。 (30分)

ePQプロセスは通常、クエリ対象のテーブルの共有ロックを取得する読み取り専用クエリです。 ただし、一部のDDL操作ではテーブルの排他ロックが必要になるため、ロックの競合によりePQプロセスによって操作がブロックされます。 このパラメーターで指定された時間、DDL操作がブロックされると、ePQクエリがキャンセルされ、DDL操作を実行するプロセスのリソースが解放されます。

ePQは、時間のかかる分析クエリを実行するためによく使用されます。 したがって、statement_timeoutを妥当な応答時間を可能にする値に設定する必要があります。 例えば、3時間に相当する10,800,000ミリ秒の値は、大規模で複雑なクエリに適している。 0のデフォルト値を使用すると (無制限の時間) 、クエリの実行に使用されたデータベース接続は、クエリの実行時間が長いため、長時間リリースされない可能性があります。

synchronous_commit

エラスティック並列クエリでデータの一貫性を確保するかどうかを指定します。 有効な値:

  • on: エラスティック並列クエリでデータの一貫性を確保します。 データベースは、クライアントに成功したトランザクションコミットを返す前に、ディスクに書き込まれるWAL (write-ahead logging) レコードを待ちます。

  • off (デフォルト): エラスティック並列クエリでデータの一貫性を保証しません。

ベストプラクティス

特定のテーブルに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_pxonに設定し、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_pxONに設定します。

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. 次の例では、の値 N6.

=> /*+ 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)