postgresql 并行查询的探究

本文深入探讨了PostgreSQL的并行查询,包括相关配置参数如max_worker_processes、max_parallel_workers和max_parallel_workers_per_gather等。文章介绍了并行查询的实现机制,如并行扫描、并行JOIN和并行聚合,并通过实例展示了如何提高查询效率。通过调整参数和强制启用并行,观察到查询性能的显著提升,尤其是在聚合函数和大型表的JOIN操作中。
摘要由CSDN通过智能技术生成

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=8) (actual time=1921.058…1921.058 row

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值