首頁 > 軟體

PostgreSQL平行計算演演算法及引數強制並行度設定方法

2022-04-06 19:04:11

一、優化器平行計算的並行度計算方法

1、總worker程序數

postgres=# show  ;      
 max_worker_processes     
----------------------    
 128    
(1 row)   

2、所有對談,在同一時刻的QUERY,平行計算最大允許開啟的WORKER數。

max_parallel_workers    

3、單條QUERY中,每個node最多允許開啟的平行計算WORKER數

postgres=# show max_parallel_workers_per_gather ;    
 max_parallel_workers_per_gather     
---------------------------------    
 0    
(1 row)    

4、單個query, node的並行度

Min(parallel_workers(表級設定,沒有設定則,根據表大小計算得到), max_parallel_workers_per_gather)    

5、表級並行度引數,預設不設定,從表大小計算。

postgres=# alter table pa set (parallel_workers =32);    
ALTER TABLE    

6、真實並行度演演算法

min (max_worker_processes - 已執行workers ,     
     max_parallel_workers - 其他對談當前真實啟用的並行度 ,      
     Min(parallel_workers(表級設定,沒有設定則,根據表大小計算得到), max_parallel_workers_per_gather)     
)   

二、優化器是否選擇平行計算

優化器是否使用平行計算,取決於CBO,選擇成本最低的方法,平行計算成本估算,成本因子引數如下:

postgres=# show parallel_tuple_cost ;    
 parallel_tuple_cost     
---------------------    
 0    
(1 row)    
postgres=# show parallel_setup_cost ;    
 parallel_setup_cost     
---------------------    
 0    
(1 row)    

如果非平行計算的執行計劃成本低於平行計算的成本,則不使用平行計算。

三、優化器是否忽略平行計算

如果表掃描或索引掃描的表或索引低於設定的閾值,這個表掃描或索引掃描則不啟用平行計算。

postgres=# show min_parallel_table_scan_size ;    
 min_parallel_table_scan_size     
------------------------------    
 0    
(1 row)    
postgres=# show min_parallel_index_scan_size ;    
 min_parallel_index_scan_size     
------------------------------    
 0    
(1 row)    

四、優化器強制選擇平行計算引數

#force_parallel_mode = on

五、平行計算相關引數

1、建立索引,CREATE TABLE AS,SELECT INTO 的並行度

postgres=# show max_parallel_maintenance_workers ;    
 max_parallel_maintenance_workers     
----------------------------------    
 24    
(1 row)   

2、並行分割區表JOIN

#enable_partitionwise_join = on    

3、並行分割區表分割區聚合

#enable_partitionwise_aggregate = on    

4、並行HASH計算

#enable_parallel_hash = on    

5、LEADER主動獲取並行WORKER的返回結果

parallel_leader_participation = on 

6、並行APPEND(分割區表),UNION ALL查詢

#enable_parallel_append = on    

六、強行並行

強制並行度24

1、總的可開啟的WORKER足夠大  
postgres=# show max_worker_processes ;  
 max_worker_processes   
----------------------  
 128  
(1 row)  
  
2、所有對談同時執行平行計算的並行度足夠大  
postgres=# set max_parallel_workers=64;  
SET  
3、單個QUERY中平行計算NODE開啟的WORKER=24  
postgres=# set max_parallel_workers_per_gather =24;  
4、所有表和索引掃描允許並行  
postgres=# set min_parallel_table_scan_size =0;  
postgres=# set min_parallel_index_scan_size =0;  
5、平行計算優化器成本設定為0  
postgres=# set parallel_tuple_cost =0;  
postgres=# set parallel_setup_cost =0;  
6、設定表級並行度為24  
postgres=# alter table pa set (parallel_workers =24);  
ALTER TABLE  
7、效果,強制24並行。  
postgres=# explain (analyze) select count(*) from pa;  
                                                             QUERY PLAN                                                                
-------------------------------------------------------------------------------------------------------------------------------------  
 Finalize Aggregate  (cost=1615.89..1615.89 rows=1 width=8) (actual time=81.711..81.711 rows=1 loops=1)  
   ->  Gather  (cost=1615.83..1615.83 rows=24 width=8) (actual time=81.572..90.278 rows=25 loops=1)  
         Workers Planned: 24  
         Workers Launched: 24  
         ->  Partial Aggregate  (cost=1615.83..1615.83 rows=1 width=8) (actual time=58.411..58.411 rows=1 loops=25)  
               ->  Parallel Seq Scan on pa  (cost=0.00..712.71 rows=416667 width=0) (actual time=0.012..35.428 rows=400000 loops=25)  
 Planning Time: 0.449 ms  
 Execution Time: 90.335 ms  
(8 rows)  

七、函數並行

1、並行函數

create or replace function ftest(int) returns boolean as $$    
  select $1<1000;    
$$ language sql strict    
parallel safe;    
    
-- parallel safe 語法  

2、並行聚合函數

combinefunc    

到此這篇關於PostgreSQL 平行計算演演算法,引數,強制並行度設定的文章就介紹到這了,更多相關PostgreSQL 平行計算演演算法內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com