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

PolarDB:テーブルサイズまたは実行計画コストに基づく ePQ 使用の制御

最終更新日:Jan 14, 2026

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 の使用を強制するかどうかを指定します。有効な値:

  • [ON]:クエリに ePQ の使用を強制します。

  • [OFF] (デフォルト):クエリに ePQ の使用を強制しません。

使用ガイド

  1. データを準備します。

    CREATE TABLE test (id INT);
    INSERT INTO test SELECT generate_series(1, 1000);
    ANALYZE test;
  2. 実行計画コストを表示します。

    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)
  3. テーブルサイズを表示します。

    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)
  4. しきい値をクリアします。

    実行コストとしきい値のテーブルサイズを無視し、クエリに 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)
  5. データ挿入後の実行計画の再実行コスト。

    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)