PolarDB PostgreSQL版支援彈性跨機並行查詢 (elastic Parallel Query,簡稱ePQ),能夠高效支援輕量級的分析型查詢,滿足使用者日漸需要的HTAP能力。
簡介
當查詢使用ePQ特性時,PolarDB PostgreSQL版將通過ePQ最佳化器,產生能夠被多個計算節點並存執行的執行計畫。ePQ的執行引擎將在多個計算節點上協調執行該計劃,同時利用多個節點的CPU、記憶體、I/O頻寬來掃描、計算資料。
您可以通過GUC參數動態調整參與ePQ並存執行的計算節點 (Scale Out),以及節點上的單機並行度 (Scale Up),從而實現Serverless彈性擴充。
ePQ善於解決複雜、執行時間長的OLAP長查詢,不適用於簡單、執行時間短的OLTP短查詢。對於短查詢而言,計算節點之間建立串連、資料交換、銷毀串連的開銷反而會引發查詢效能的回退。PolarDB PostgreSQL版支援根據表的大小或執行計畫的代價來控制對查詢使用ePQ還是單機執行,從而在查詢不同大小的表和執行不同代價的計劃時,能夠選擇效能更好的查詢執行方式。
關於更多ePQ的原理介紹和效能資料,請參見PolarDB PostgreSQL版:ePQ架構詳解。
一鍵開啟ePQ功能
如果當前有張表t1,可以通過以下命令一鍵開啟ePQ功能。如輸出所示,如果計劃中出現PolarDB PX Optimizer,則說明ePQ已經生效。
SET polar_enable_px = 1;
EXPLAIN SELECT * FROM t1;
QUERY PLAN
-------------------------------------------------------------------------------
PX Coordinator 6:1 (slice1; segments: 6) (cost=0.00..431.00 rows=1 width=8)
-> Partial Seq Scan on t1 (cost=0.00..431.00 rows=1 width=8)
Optimizer: PolarDB PX Optimizer
(3 rows)
SELECT * FROM t1;GUC參數說明
參數 | 說明 |
polar_enable_px | 用於開啟或關閉ePQ功能。取值如下:
說明 當參數開啟後,查詢將會優先進入ePQ最佳化器中,產生能夠被並存執行的計。此外,所有ePQ相關的GUC參數將會開始生效。 |
polar_px_nodes | 用於指定參與ePQ的計算節點名稱。預設值為空白,表示所有隻讀節點都參與ePQ並存執行: 如果只想配置特定的唯讀節點參與ePQ並存執行,可以通過以下方法擷取唯讀節點的名稱: 然後將得到的節點名稱以逗號分隔,設定polar_px_nodes: |
polar_px_dop_per_node | 用於設定當前會話中每個計算節點上參與ePQ並存執行的背景工作處理序數。預設值為3。 說明 一般最佳實務值是當前節點CPU核心數的一半。如果當前節點的CPU負載較高,可以遞減該參數,直到CPU佔用率不超過 80%。當查詢效能不佳時,也可以遞增該參數,但不要使CPU佔用率超過80%,否則可能會拖慢系統的其它後台進程。 |
polar_px_max_workers_number | 用於設定每個計算節點上最多可以同時存在的ePQ背景工作處理序數量。預設值為30。 說明 如果超出這個限制時,查詢將會出錯: 此時,可以增大該參數,以避免出現類似的報錯。如果該參數設定得過大,也有可能會使節點上的進程數量過多,增大了OOM的風險。 |
polar_px_wait_lock_timeout | 用於設定ePQ進程阻塞其它進程的最大時間。預設值為1800000毫秒(半小時)。 ePQ進程通常是唯讀查詢,會對進行查詢的表加共用鎖定。而使用者的部分DDL需要對錶加獨佔鎖定,從而因鎖衝突而被ePQ進程阻塞,在阻塞到該參數所指定的毫秒數後,ePQ查詢將會被取消,為執行DDL的進程讓路。 由於ePQ通常被用於執行較為耗時的分析型查詢,因此 |
synchronous_commit | 用於確保ePQ並行查詢的資料一致性。取值如下:
|
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進行查詢。 |
最佳實務
允許特定的表使用ePQ
如果只想針對特定表執行ePQ,可以開啟polar_px_enable_check_workers參數。同時對需要執行ePQ的表顯式設定px_workers選項。
ALTER TABLE t1 SET (px_workers = 1);px_workers的取值如下:
-1:禁止對該表使用ePQ並存執行。0:預設狀態,對該表忽略ePQ並存執行。1:允許對該表使用ePQ並存執行。
開啟ePQ功能
全域層級
在PolarDB控制台上設定polar_enable_px參數為on,即可全域啟用ePQ功能,無論是OLTP查詢還是OLAP查詢,都將預設使用ePQ。
使用如下樣本查看執行計畫。如果計劃中出現PolarDB PX Optimizer,則說明ePQ已經生效:
=> EXPLAIN SELECT * FROM t1;
QUERY PLAN
-------------------------------------------------------------------------------
PX Coordinator 6:1 (slice1; segments: 6) (cost=0.00..431.00 rows=1 width=8)
-> Partial Seq Scan on t1 (cost=0.00..431.00 rows=1 width=8)
Optimizer: PolarDB PX Optimizer
(3 rows)會話層級
在會話內設定polar_enable_px參數為ON,使當前會話內的所有查詢預設使用ePQ:
SET polar_enable_px = ON;資料庫層級/使用者層級
在全域層級或會話層級啟用ePQ後,會話內的所有的查詢都會優先使用ePQ。從最佳實務的角度來說,ePQ更適用於需要進行大量OLAP負載的長查詢,而不適用於OLTP短查詢。對於短查詢來說,ePQ在計算節點間的建立串連、資料交換、銷毀串連的開銷將會引發查詢效能的回退。
如果在業務設計上需要使用到ePQ,那麼可以將業務中的分析型SQL提取出來,使用一個特定的資料庫來進行ePQ查詢:
ALTER DATABASE ap_database SET polar_enable_px = ON;或使用某個特定的賬戶,專門用來執行分析型的SQL:
ALTER ROLE ap_role SET polar_enable_px = ON;查詢層級
如果只想對一個會話內的某幾條特定查詢(例如,夜間報表業務)使用ePQ,可以藉助pg_hint_plan外掛程式,通過SQL Hint對特定查詢啟用ePQ。為使SQL Hint生效,需要確保pg_hint_plan外掛程式已經被添加到GUC參數shared_preload_libraries中。
在查詢前添加/*+ PX() */表示對該查詢使用ePQ:
=> /*+ PX() */ EXPLAIN SELECT * FROM t1;
QUERY PLAN
----------------------------------------------------------------------------------
PX Coordinator 6:1 (slice1; segments: 6) (cost=0.00..431.03 rows=1000 width=8)
-> Partial Seq Scan on t1 (cost=0.00..431.00 rows=167 width=8)
Optimizer: PolarDB PX Optimizer
(3 rows)在查詢前添加/*+ NoPX() */表示對該查詢不使用ePQ:
=> /*+ NoPX() */ EXPLAIN SELECT * FROM t1;
QUERY PLAN
------------------------------------------------------
Seq Scan on t1 (cost=0.00..15.00 rows=1000 width=8)
(1 row)在查詢前添加/*+ PX(N) */表示以N作為單節點並行度使用ePQ。例如,N取值為6:
=> /*+ PX(6) */ EXPLAIN SELECT * FROM t1;
QUERY PLAN
------------------------------------------------------------------------------------
PX Coordinator 12:1 (slice1; segments: 12) (cost=0.00..431.02 rows=1000 width=8)
-> Partial Seq Scan on t1 (cost=0.00..431.00 rows=84 width=8)
Optimizer: PolarDB PX Optimizer
(3 rows)