PolarDB for PostgreSQL では、テーブルサイズまたは実行計画コストに基づいて、クエリに ePQ を使用するか、シングルノード実行を使用するかを制御できます。
適用範囲
この機能は、マイナーエンジンバージョンが 2.0.14.9.15.0 以降の PostgreSQL 14 を実行する PolarDB for PostgreSQL クラスターでサポートされています。
コンソールを使用してマイナーエンジンバージョン番号を表示するか、SHOW polardb_version; 文を実行できます。マイナーエンジンバージョンの要件が満たされていない場合は、マイナーエンジンバージョンをアップグレードできます。
背景情報
ePQ は、実行時間が長い複雑なオンライン分析処理 (OLAP) クエリの処理に優れています。実行時間が短い単純なオンライントランザクション処理 (TP) クエリには適していません。短いクエリの場合、コンピューティングノード間の接続確立、データ交換、接続クローズのオーバーヘッドにより、パフォーマンスが低下する可能性があります。PolarDB for PostgreSQL では、テーブルサイズまたは実行計画コストに基づいて、ePQ を使用するかシングルノード実行を使用するかを制御できます。これにより、クエリに対してよりパフォーマンスの高い実行モードを選択できます。
注意事項
実行計画コストのしきい値とテーブルサイズのしきい値は、次のオブジェクトまたは操作にのみ適用されます:
標準テーブル
パーティションテーブル
マテリアライズドビュー
ePQ ヒント
/*+ PX() */がないクエリ
パラメータ
パラメータ | 説明 |
polar_px_min_pg_plan_cost | ePQ を有効にするための最小実行計画コスト。有効値は 0 から 999999999999 です。デフォルト値は 50000 です。シングルノード実行計画コストがこのしきい値を下回るクエリでは、ePQ は使用されません。 |
polar_px_min_table_scan_size | ePQ を有効にするための最小テーブルサイズ。有効値は 0 から 2147483647 です。デフォルト値は 100 MB です。クエリで参照されるすべてのテーブルのサイズがこのしきい値を下回る場合、ePQ は使用されません。 |
polar_px_force_use | クエリに ePQ の使用を強制するかどうかを指定します。有効な値:
|
使用ガイド
データを準備します。
CREATE TABLE test (id INT); INSERT INTO test SELECT generate_series(1, 1000); ANALYZE test;実行計画コストを表示します。
ePQ を無効にして、シングルノード実行計画を表示します。
SET polar_enable_px TO OFF; EXPLAIN SELECT COUNT(*) FROM test;次の結果が返されます:
QUERY PLAN -------------------------------------------------------------- Aggregate (cost=17.50..17.51 rows=1 width=8) -> Seq Scan on test (cost=0.00..15.00 rows=1000 width=0) (2 rows)実行計画では、各行の
cost=xxx..xxxは、現在のオペレーターの推定実行コストを示します。..の前の値は起動コストで、後の値は総コストです。最上位オペレーターの総コストが、クエリの総実行コストです。たとえば、上記の計画の総実行コストは17.51です。シングルノード実行計画の総コストはpolar_px_min_pg_plan_costパラメーターで指定された最小実行計画コストよりも低いため、ePQ が有効な場合でもこのクエリでは ePQ は使用されません。SET polar_enable_px TO ON; EXPLAIN SELECT COUNT(*) FROM test; QUERY PLAN -------------------------------------------------------------- Aggregate (cost=17.50..17.51 rows=1 width=8) -> Seq Scan on test (cost=0.00..15.00 rows=1000 width=0) (2 rows)テーブルサイズを表示します。
pg_relation_size関数を使用してテーブルサイズを表示します。SELECT pg_size_pretty(pg_relation_size('test'));結果は次のとおりです:
pg_size_pretty ---------------- 40 kB (1 row)この結果は、
testテーブルが 40 kB であり、polar_px_min_table_scan_sizeパラメーターで指定された最小テーブルサイズよりも小さいことを示しています。したがって、testテーブルのみを参照するクエリでは、ePQ が有効な場合でも ePQ は使用されません。SET polar_enable_px TO ON; EXPLAIN SELECT COUNT(*) FROM test AS a, test AS b, test AS c WHERE a.id > b.id AND b.id > c.id; QUERY PLAN ---------------------------------------------------------------------------------- Aggregate (cost=5292822.50..5292822.51 rows=1 width=8) -> Nested Loop (cost=0.00..5015045.00 rows=111111000 width=0) Join Filter: (b.id > c.id) -> Nested Loop (cost=0.00..15032.50 rows=333333 width=4) Join Filter: (a.id > b.id) -> Seq Scan on test a (cost=0.00..15.00 rows=1000 width=4) -> Materialize (cost=0.00..20.00 rows=1000 width=4) -> Seq Scan on test b (cost=0.00..15.00 rows=1000 width=4) -> Materialize (cost=0.00..20.00 rows=1000 width=4) -> Seq Scan on test c (cost=0.00..15.00 rows=1000 width=4) (10 rows)しきい値をクリアします。
実行コストとしきい値のテーブルサイズを無視し、クエリに ePQ の使用を強制するには、
polar_px_force_useパラメーターを設定します。SET polar_enable_px TO ON; SET polar_px_force_use TO ON; EXPLAIN SELECT COUNT(*) FROM test;次の結果が返されます:
QUERY PLAN ------------------------------------------------------------------------------------- Finalize Aggregate (cost=0.00..431.00 rows=1 width=8) -> PX Coordinator 6:1 (slice1; segments: 6) (cost=0.00..431.00 rows=1 width=8) -> Partial Aggregate (cost=0.00..431.00 rows=1 width=8) -> Partial Seq Scan on test (cost=0.00..431.00 rows=167 width=1) Optimizer: PolarDB PX Optimizer (5 rows)データ挿入後の実行計画の再実行コスト。
ePQ を使用する条件を満たすために、テーブルにさらにデータを挿入します。
INSERT INTO test SELECT generate_series(1, 10000000); ANALYZE test; SELECT pg_size_pretty(pg_relation_size('test'));次の結果が返されます:
pg_size_pretty ---------------- 348 MB (1 row)この時点で、
testテーブルのサイズは、polar_px_min_table_scan_sizeパラメーターで指定された最小テーブルサイズを超えています。また、次のクエリのシングルノード実行計画コストも、
polar_px_min_pg_plan_costパラメーターで指定された最小実行計画コストを超えています。SET polar_enable_px TO OFF; EXPLAIN SELECT COUNT(*) FROM test;次の出力が返されます。
QUERY PLAN ----------------------------------------------------------------------------------------- Finalize Aggregate (cost=97621.42..97621.43 rows=1 width=8) -> Gather (cost=97621.21..97621.42 rows=2 width=8) Workers Planned: 2 -> Partial Aggregate (cost=96621.21..96621.22 rows=1 width=8) -> Parallel Seq Scan on test (cost=0.00..86205.77 rows=4166177 width=0) (5 rows)ePQ が有効な場合、上記のクエリでは ePQ が使用されます。
SET polar_enable_px TO ON; SET polar_px_force_use TO OFF; EXPLAIN SELECT COUNT(*) FROM test; QUERY PLAN -------------------------------------------------------------------------------------- Finalize Aggregate (cost=0.00..470.76 rows=1 width=8) -> PX Coordinator 6:1 (slice1; segments: 6) (cost=0.00..470.76 rows=1 width=8) -> Partial Aggregate (cost=0.00..470.76 rows=1 width=8) -> Partial Seq Scan on test (cost=0.00..467.66 rows=1666471 width=1) Optimizer: PolarDB PX Optimizer (5 rows)