全部產品
Search
文件中心

PolarDB:根據表大小或代價控制是否使用ePQ

更新時間:Jan 14, 2026

PolarDB PostgreSQL版支援根據表的大小或執行計畫的代價來控制對查詢使用ePQ還是單機執行。

適用範圍

支援的PolarDB PostgreSQL版的版本如下: PostgreSQL 14,且核心小版本需為2.0.14.9.15.0及以上。

說明

您可在控制台查看核心小版本號碼,也可以通過SHOW polardb_version;語句查看。如未滿足核心小版本要求,請升級核心小版本

背景資訊

ePQ善於解決複雜、執行時間長的OLAP長查詢,不適用於簡單、執行時間短的OLTP短查詢。對於短查詢而言,計算節點之間建立串連、資料交換、銷毀串連的開銷反而會導致效能下降。PolarDB PostgreSQL版支援根據表的大小或執行計畫的代價來控制對查詢使用ePQ還是單機執行,從而在查詢不同大小的表和執行不同代價的計劃時,能夠選擇效能更好的查詢執行方式。

注意事項

執行計畫代價閾值和表大小閾值目前僅支援以下對象或操作:

  • 普通表

  • 分區表

  • 物化視圖

  • 不帶有ePQ的Hint /*+ 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所指定的最小表大小,所以即使開啟ePQ,任何只引用test表的查詢都不會使用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)