网站/小程序/APP个性化定制开发,二开,改版等服务,加扣:8582-36016

这篇文章主要介绍了PostgreSQL 并行计算算法,参数,强制并行度设置,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

一、优化器并行计算的并行度计算方法

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 并行计算算法,参数,强制并行度设置的文章就介绍到这了 


评论 0

暂无评论
0
0
0
立即
投稿
发表
评论
返回
顶部