PostgreSQL并行计算算法及参数强制并行度设置方法

 更新时间:2022年04月06日 15:12:57   作者:数据库集中营  
这篇文章主要介绍了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 并行计算算法,参数,强制并行度设置的文章就介绍到这了,更多相关PostgreSQL 并行计算算法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Postgres中UPDATE更新语句源码分析

    Postgres中UPDATE更新语句源码分析

    这篇文章主要给大家介绍了关于Postgres中UPDATE更新语句源码分析的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2022-03-03
  • Ruoyi从mysql切换到postgresql的几个踩坑实战

    Ruoyi从mysql切换到postgresql的几个踩坑实战

    最近由于工作的原因,需要将Ruoyi从mysql切换到postgresql,所以这篇文章主要给大家介绍了关于Ruoyi从mysql切换到postgresql的几个踩坑实战,需要的朋友可以参考下
    2023-02-02
  • postgresql数据库根据年月查询出本月的所有数据操作

    postgresql数据库根据年月查询出本月的所有数据操作

    这篇文章主要介绍了postgresql数据库根据年月查询出本月的所有数据操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • PostgreSQL导出数据库表(或序列)的结构和数据实例代码

    PostgreSQL导出数据库表(或序列)的结构和数据实例代码

    这篇文章主要给大家介绍了关于PostgreSQL导出数据库表(或序列)的结构和数据的相关资料,你可以使用pg_dump命令来导出PostgreSQL数据库中的表结构和数据,需要的朋友可以参考下
    2023-10-10
  • PostgreSQL如何根据字符串的长度排序

    PostgreSQL如何根据字符串的长度排序

    在PostgreSQL数据库中,可以通过LENGTH函数获取字符串的长度,并据此进行排序,LENGTH函数会计算并返回字符串的字符数量,要根据字符串长度进行升序排序,可以在SQL查询中直接使用LENGTH函数,本文介绍PostgreSQL如何根据字符串的长度排序,感兴趣的朋友一起看看吧
    2024-11-11
  • 使用PostgreSQL为表或视图创建备注的操作

    使用PostgreSQL为表或视图创建备注的操作

    这篇文章主要介绍了使用PostgreSQL为表或视图创建备注的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • postgresql如何找到表中重复数据的行并删除

    postgresql如何找到表中重复数据的行并删除

    这篇文章主要介绍了postgresql如何找到表中重复数据的行并删除问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • PostgreSQL教程(九):事物隔离介绍

    PostgreSQL教程(九):事物隔离介绍

    这篇文章主要介绍了PostgreSQL教程(九):事物隔离介绍,本文主要针对读已提交和可串行化事物隔离级别进行说明和比较,需要的朋友可以参考下
    2015-05-05
  • 基于PostgreSQL的时序数据库TimescaleDB的基本用法和概念

    基于PostgreSQL的时序数据库TimescaleDB的基本用法和概念

    时序数据是指按照时间顺序存储的数据,TimescaleDB是一个开源的、扩展了PostgreSQL的时序数据库扩展,本文就给大家详细的介绍一下基于PostgreSQL的时序数据库TimescaleDB的基本用法和概念,需要的朋友可以参考下
    2023-06-06
  • 使用PostgreSQL数据库建立用户画像系统的方法

    使用PostgreSQL数据库建立用户画像系统的方法

    这篇文章主要介绍了使用PostgreSQL数据库建立用户画像系统,下面使用一个具体的例子来说明如何使用PostgreSQL的json数据类型来建立用户标签数据,需要的朋友可以参考下
    2022-10-10

最新评论