首页-沐鸣娱乐-官方注册站

全国加盟咨询热线:

400-123-4567

当前位置: 首页 > 沐鸣资讯 > 行业动态

PostgreSQL 9.6 并行计算 优化器算法浅析

文章作者:佚名 浏览次数:发表时间:2024-06-10 05:42:56

之前写过几篇 PostgreSQL 并行计算的文章,文中并没有仔细描述PostgreSQL是如何决策并行计算,以及并行度的。

PostgreSQL 并不需要用户在SQL中使用HINT来启用并行计算,因为优化器会从成本的角度做出选择,是否使用,以及使用的并行度是多大。

PostgreSQL会通过这些参数来决定是否使用并行,以及该启用几个work process。

  • max_worker_processes (integer)
    很显然,这个参数决定了整个数据库集群允许启动多少个work process,注意如果有standby,standby的参数必须大于等于主库的参数值。

如果设置为0,表示不允许并行。

 
  • max_parallel_workers_per_gather (integer)
    这个参数决定了每个Gather node最多允许启用多少个work process。

    同时需要注意,在OLTP业务系统中,不要设置太大,因为每个worker都会消耗同等的work_mem等资源,争抢会比较厉害。

建议在OLAP中使用并行,并且做好任务调度,减轻冲突。

 

例子,WITH语法中,有两个QUERY用来并行计算,虽然设置的max_parallel_workers_per_gather=6,但是由于max_worker_processes=8,所以第一个Gather node用了6个worker process,而另一个Gather实际上只用了2个worker。

 
  • parallel_setup_cost (floating point)
    表示启动woker process的启动成本,因为启动worker进程需要建立共享内存等操作,属于附带的额外成本。
 
  • parallel_tuple_cost (floating point)
    woker进程处理完后的tuple要传输给上层node,即进程间的row交换成本,按node评估的输出rows来乘。
 

代码如下

 
  • min_parallel_relation_size (integer)
    表的大小,也作为是否启用并行计算的条件,如果小于它,不启用并行计算。

    但是也请注意,还有其他条件决定是否启用并行,所以并不是小于它的表就一定不会启用并行。

 

代码如下
src/backend/optimizer/path/allpaths.c

 
  • force_parallel_mode (enum)
    强制开启并行,可以作为测试的目的,也可以作为hint来使用。
 
  • parallel_workers (integer)
    以上都是数据库的参数,parallel_workers是表级参数,可以在建表时设置,也可以后期设置。

代码见create_plain_partial_paths()

 

例子

 
 

其实前面在讲参数时都已经讲到了,这里再总结一下。

  1. 决定整个系统能开多少个worker进程
    max_worker_processes
  2. 计算并行计算的成本,优化器根据CBO原则选择是否开启并行
    parallel_setup_cost

parallel_tuple_cost

所以简单QUERY,如果COST本来就很低(比如小于并行计算的启动成本),那么很显然数据库不会对这种QUERY启用并行计算。

  1. 强制开启并行的开关
    force_parallel_mode

当第二步计算出来的成本大于非并行的成本时,可以通过这种方式强制让优化器开启并行查询。

  1. 根据表级parallel_workers参数决定每个Gather node的并行度
    取min(parallel_workers, max_parallel_workers_per_gather)
  2. 当表没有设置parallel_workers参数并且表的大小大于min_parallel_relation_size是,由算法决定每个Gather node的并行度
    相关参数 min_parallel_relation_size

算法见 create_plain_partial_paths
取Min(parallel_workers, max_parallel_workers_per_gather)

注意实际上,每个Gather能开启多少个worker还和PG集群总体剩余可以开启的worker进程数相关。
因此实际开启的可能小于优化器算出来的。从前面的例子中也可以理解。

  1. 用户也可以使用hint来控制优化器选择是否强制并行 , 参考pg_hint_plan插件的用法。

    祝大家玩得开心,欢迎随时来 阿里云促膝长谈业务需求 ,恭候光临

阿里云的小伙伴们加油,努力 做好内核与服务,打造最贴地气的云数据库

回顶部

平台注册入口