postgresql 并行查询的探究

postgrwsql 并行查询

1.并行查询的相关配置参数

max_worker_processes:决定了整个数据库集群允许启动多少个work process(注意如果有standby,standby的参数必须大于等于主库的参数值)。设置为0,表示不允许并行。设置系统支持的最大后台进程数,默认值为8,如果有备库,备库上此参数必须大于或等于主库的此参数配置值,此参数调整后需重启数据库才能生效

max_parallel_workers:设置系统支持的最大查询进程数,此参数受max_worker_processes参数影响。

max_parallel_workers_per_gather: 最多会有多少个后台进程来一起完成当前查询,推荐值为1-4。这些workers主要来自max_worker_processes(进程池的大小)。在OLTP业务中,因为每个worker都会消耗同等的work_mem等资源,可能会产生比较严重的争抢。

min_parallel_relation_size: 启用并行查询的最小数据表的大小,作为是否启用并行计算的条件之一,如果小于它,不启用并行计算。并不是所有小于它的表一定不会启用并行。

parallel_setup_cost:表示启动woker process的启动成本,因为启动worker进程需要建立共享内存等操作,属于附带的额外成本。其值越小,数据库越有可能使用并行查询。

parallel_tuple_cost:woker进程处理完后的tuple要传输给上层node,即进程间查询结果的交换成本,即后台进程间传输一个元组的代价。其值越小,数据库越有可能使用并行。

force_parallel_mode: 主要用于测试,on/true表示强制使用并行查询。

parallel_workers:设置表级并行度,可在建表时设置,也可后期设置

参数值大小关系:

max_worker_processes>max_parallel_workers>max_parallel_workers_per_gather

并行查询功能说明
现在支持的并行场景主要是以下3种:

parallel sequential scan (并行扫描)
parallel join(并行join)
parallel aggregation(并行聚合)

并行查询有基于代价策略的判断,譬如小数据量时默认还是普通执行。在PostgreSQL的配置参数中,提供了一些跟并行查询相关的参数。我们想测试并行,一般设置下面两个参数:

2.并行查询的实现

PostgreSQL的并行由多个进程的机制完成。每个进程在内部称之为1个worker,这些worker可以动态地创建、销毁。PostgreSQL在SQL语句解析和生成查询计划阶段并没有并行。在执行器(Executor)模块,由多个worker并发执行被分片过的子任务。即使在查询计划被并行执行的环节,一直存在的进程也会充当一个worker来完成并行的子任务,我们可以称之为主进程。同时,根据配置参数指定的worker数,再启动n个worker进程来执行其他子计划。

PostgreSQL内延续了共享内存的机制,在每个worker初始化时就为每个worker分配共享内存,用于worker各自获取计划数据和缓存中间结果。这些worker间没有复杂的通信机制,而是都由主进程做简单的通信,来启动和执行计划。

PostgreSQL并行查询的框架

图1  PostgreSQL并行查询的框架

Hash Join的场景为例,在执行器层面,并行查询的执行流程

set max_parallel_workers_per_gather TO 4;
EXPLAIN ANALYZE
SELECT * FROM pets left JOIN people ON pets.owner_id = people.id WHERE pets.species = ‘cat’ AND people.age<18;

Gather (cost=199677.39…389387.73 rows=890713 width=16) (actual time=1761.945…4242.497 rows=875330 loops=1)
Workers Planned: 4
Workers Launched: 4
-> Hash Join (cost=198677.39…299316.43 rows=222678 width=16) (actual time=1928.009…3678.576 rows=175066 loops=5)
​ Hash Cond: (pets.owner_id = people.id)
​ -> Parallel Seq Scan on pets (cost=0.00…75498.15 rows=1241422 width=8) (actual time=0.113…397.605 rows=999805 loops=5)
​ Filter: (species = ‘cat’::bpchar)
​ Rows Removed by Filter: 1000195
​ -> Hash (cost=169248.60…169248.60 rows=1793743 width

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值