全部產品
Search
文件中心

PolarDB:最佳實務

更新時間:Jul 06, 2024

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功能。取值如下:

  • on:開啟ePQ功能。

  • off(預設):關閉ePQ功能。

說明

當參數開啟後,查詢將會優先進入ePQ最佳化器中,產生能夠被並存執行的計。此外,所有ePQ相關的GUC參數將會開始生效。

polar_px_nodes

用於指定參與ePQ的計算節點名稱。預設值為空白,表示所有隻讀節點都參與ePQ並存執行:

如果只想配置特定的唯讀節點參與ePQ並存執行,可以通過以下方法擷取唯讀節點的名稱:

=> CREATE EXTENSION polar_monitor;
CREATE EXTENSION

=> SELECT name,slot_name,type FROM polar_cluster_info WHERE type = 'Replica';
 name  | slot_name |  type
-------+-----------+---------
 node2 | replica1  | Replica
 node3 | replica2  | Replica
(2 rows)

然後將得到的節點名稱以逗號分隔,設定polar_px_nodes:

=> SET polar_px_nodes = 'node2,node3';
=> SHOW polar_px_nodes;
 polar_px_nodes
----------------
 node2,node3
(1 row)

polar_px_dop_per_node

用於設定當前會話中每個計算節點上參與ePQ並存執行的背景工作處理序數。預設值為3。

說明

一般最佳實務值是當前節點CPU核心數的一半。如果當前節點的CPU負載較高,可以遞減該參數,直到CPU佔用率不超過 80%。當查詢效能不佳時,也可以遞增該參數,但不要使CPU佔用率超過80%,否則可能會拖慢系統的其它後台進程。

polar_px_max_workers_number

用於設定每個計算節點上最多可以同時存在的ePQ背景工作處理序數量。預設值為30。

說明

如果超出這個限制時,查詢將會出錯:

ERROR:  over px max workers, already xxx workers, max 30 workers

此時,可以增大該參數,以避免出現類似的報錯。如果該參數設定得過大,也有可能會使節點上的進程數量過多,增大了OOM的風險。

polar_px_wait_lock_timeout

用於設定ePQ進程阻塞其它進程的最大時間。預設值為1800000毫秒(半小時)。

ePQ進程通常是唯讀查詢,會對進行查詢的表加共用鎖定。而使用者的部分DDL需要對錶加獨佔鎖定,從而因鎖衝突而被ePQ進程阻塞,在阻塞到該參數所指定的毫秒數後,ePQ查詢將會被取消,為執行DDL的進程讓路。

由於ePQ通常被用於執行較為耗時的分析型查詢,因此statement_timeout參數需要根據情況設定為一個合理的回應時間,例如10800000毫秒(三小時)。如果使用預設值0(不限時),則執行ePQ查詢的資料庫連接可能會因為查詢用時較久而長時間無法被使用。

synchronous_commit

用於確保ePQ並行查詢的資料一致性。取值如下:

  • on:確保ePQ並行查詢的資料一致性。表示資料庫提交事務時需要等待WAL日誌刷入儲存後才能返回成功。

  • off(預設):無法確保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)