PolarDB PostgreSQL版支援根據表的大小或執行計畫的代價來控制對查詢使用ePQ還是單機執行。
適用範圍
支援的PolarDB PostgreSQL版的版本如下: PostgreSQL 14,且核心小版本需為2.0.14.9.15.0及以上。
背景資訊
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進行查詢,取值如下:
|
使用指南
準備資料。
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所指定的最小表大小,所以即使開啟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)取消閾值。
如果想要忽略執行計畫代價閾值和表大小閾值,強行讓查詢使用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)