このトピックでは、Elastic Parallel Query (ePQ) 機能を使用して、計算ノードをスケジュールし、必要な並列度 (DOP) を確保する方法について説明します。
前提条件
この機能は、次の要件を満たすPolarDB for PostgreSQLクラスターでサポートされています。
マイナーエンジンバージョンが1.1.20以降のPostgreSQL 11
マイナーエンジンバージョンが14.6.6.0以降のPostgreSQL 14
次のいずれかのステートメントを実行して、PolarDB for PostgreSQLクラスターのマイナーエンジンバージョンを照会できます。
PostgreSQL 11
ショーpolar_version;PostgreSQL 14
select version();
概要
ePQを使用すると、PolarDB for PostgreSQLクラスターの計算ノードにきめ細かい制御を実装できます。 これは、コンピューティングリソースの利用を改善する。 並列クエリにアイドルコンピューティングリソースを使用して、リソースの使用率を最大化し、他のワークロードの影響を防ぐことができます。 ePQには次の機能があります。
ePQを使用すると、PolarDB for PostgreSQLクラスターで並列クエリを実行するために、アイドルリソースを持つコンピューティングノードを動的にスケジュールできます。
ePQを使用すると、PolarDB for PostgreSQLクラスターの各計算ノードで並列クエリのDOPを動的に調整できます。 このように、並列クエリは、同じ計算ノードで実行される他のプロセスに影響を与えません。
計算ノードのスケジュール
Parameters
パラメーター | 説明 |
polar_px_nodes | 並列クエリの実行に使用される計算ノード。 既定では、このパラメーターは空のままで、すべての読み取り専用ノードが使用されることを指定します。 説明
|
polar_px_use_primary | プライマリノードを使用して並列クエリを実行するかどうかを指定します。 有効な値:
説明
|
polar_px_use_master | マスターノードを使用して並列クエリを実行するかどうかを指定します。 有効な値:
説明
|
例
次のステートメントを実行して、計算ノードの名前を返すために使用される
polar_monitor拡張子をインストールします。存在しない場合は拡張を作成しますpolar_monitor;polar_monitor拡張機能で提供されるトポロジビューを使用して、クラスター内のすべての計算ノードの名前を照会します。SELECT name,slot_name,type FROM polar_cluster_info;次のサンプルコードは、クエリ結果の例を示しています。
名 | slot_name | タイプ ------ ----------- --------------- node0 | | プライマリ node1 | standby1 | スタンバイ node2 | replica1 | レプリカ node3 | replica2 | レプリカ (4行)説明次のタイプの計算ノードが返されます。
Primary: プライマリノード。レプリカ: 読み取り専用ノード。Standby: スタンバイノード。
次のステートメントを実行して、読み込みの少ない読み取り専用ノード
node2とnode3を使用し、並列クエリを実行します。SET polar_px_nodes = 'node2,node3'; ショーpolar_px_nodes;次のサンプルコードは、結果の例を示しています。
polar_px_nodes ---------------- node2,node3 (1行)
コントロールDOP
Parameters
パラメーター | 説明 |
polar_px_dop_per_node | 現在のセッションの並列クエリの各計算ノード上のセグメント数。 各セグメントは、実行するスライス毎に処理を開始する。 デフォルト値: 3。 ベストプラクティスを実行するには、このパラメーターを計算ノードのCPUコア数の半分に設定することを推奨します。 説明
|
例
次のステートメントを実行して、クラスターにテーブルを作成します。
CREATE TABLEテスト (id INT);クラスターに2つの読み取り専用ノードがあり、
polar_px_nodesパラメーターが空のままである場合、両方の読み取り専用ノードが並列クエリの実行に使用されます。polar_px_dop_per_nodeパラメーターが3に設定されている場合、各計算ノードには3つのセグメントが含まれます。 次のサンプルコードは、実行計画の例を示しています。ショーpolar_px_nodes; polar_px_nodes ---------------- (1行) ショーpolar_px_dop_per_node; polar_px_dop_per_node ----------------------- 3 (1行) EXPLAIN SELECT * テストから; クエリ計画 ------------------------------------------------------------------------------- PXコーディネーター6:1 (slice1; セグメント: 6) (コスト=0.00 .. 431.00行=1幅=4) -> テスト時の部分的なSeqスキャン (コスト=0.00 .. 431.00行=1幅=4) Optimizer: PolarDB PX Optimizer (3行)この例では、2つの読み取り専用ノード上の6つのセグメントのそれぞれが、実行プランの唯一のスライスである
slice1を実行するプロセスを開始します。 したがって、6つのプロセスが開始され、並列にクエリが実行される。polar_px_dop_per_nodeパラメーターを4に設定してから別のクエリを実行すると、2つの読み取り専用ノードで合計8つのセグメントが使用されます。 8つのセグメントのそれぞれは、実行計画のスライスslice1のみを実行する処理を開始する。 したがって、8つのプロセスが開始され、クエリが並列に実行される。SET polar_px_dop_per_nodeに4; EXPLAIN SELECT * テストから; クエリ計画 ------------------------------------------------------------------------------- PXコーディネーター8:1 (slice1; segments: 8) (コスト=0.00 .. 431.00行=1 width=4) -> テスト時の部分的なSeqスキャン (コスト=0.00 .. 431.00行=1幅=4) Optimizer: PolarDB PX Optimizer (3行)polar_px_use_primaryパラメーターをONに設定します。これは、プライマリノードを使用して並列クエリを実行することを指定します。 この例では、プライマリノード上の4つのセグメントも使用されます。 したがって、12のプロセスが開始され、クエリが並列に実行される。SET polar_px_use_primaryにオン; EXPLAIN SELECT * テストから; クエリ計画 --------------------------------------------------------------------------------- PXコーディネーター12:1 (slice1; segments: 12) (コスト=0.00 .. 431.00行=1 width=4) -> テスト時の部分的なSeqスキャン (コスト=0.00 .. 431.00行=1幅=4) Optimizer: PolarDB PX Optimizer (3行)