前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >PostgreSQL 并行好不好,有人说好,有人说遭?

PostgreSQL 并行好不好,有人说好,有人说遭?

作者头像
AustinDatabases
发布于 2025-05-17 05:22:17
发布于 2025-05-17 05:22:17
980
举报
文章被收录于专栏:AustinDatabasesAustinDatabases

上个月,接了一个活,鸿门宴讲PostgreSQL -- 被拉去央企救场一天去给人家讲一下PostgreSQL的并行,本着给谁讲不是讲,他们花钱这里免费的原则。我总结了一下PostgreSQL并行的知识点。

PostgreSQL 并行
PostgreSQL 并行

PostgreSQL 并行

今天这么多的内容是写不完的,本期只针对SQL查询的部分进行内容的撰写和分析。随着主机的CPU核心的数量增多,对于SQL的并行的支持一直是各种商业数据库要考量的部分,作为开源的数据库PostgreSQL在SQL并行方面相对于其他的一些开源数据库是很良心的。

基于开源的POSTGRESQL数据库在QUERY并行参数的部分,给出了甚多的自由调整的参数,

参数

作用

建议

max_parallel_workers_per_gather

每个 Gather 节点最大并行 worker 数,默认 2

建议设为 CPU 核心数的一半或更高;大表可设为 4 - 8 以上 pgMustardCrunchy Data

max_parallel_workers

系统级并行 worker 总数,默认 8

应 ≥ max_parallel_workers_per_gather;不要超过 max_worker_processes PostgreSQL

max_worker_processes

后端总 worker 进程数,默认 8

留出给连接进程、维护任务等,避免配置过高导致系统负载 Database Administrators Stack Exchange

parallel_setup_cost

并行启动开销,默认 1000

可根据实际测试适当下调,让短查询也尝试并行 PostgreSQL

parallel_tuple_cost

元组传输开销,默认 0.1

若发现过多磁盘临时文件、I/O,可适当调高以减少无效并行 EDB

min_parallel_table_scan_size

并行顺序扫描阈值(表),默认 8MB

小表不并行;如业务表偏小,可酌情降低阈值 PostgreSQL

min_parallel_index_scan_size

并行索引扫描阈值(索引),默认 512KB

同上;索引扫描更轻量,可设置更低 PostgreSQL

parallel_leader_participation

是否让领导进程参与并行计算,默认 on

高 worker 数时可 off,让 leader 专注于收集合并 PostgreSQL

work_mem

单个 worker 的排序/哈希内存

并行时多个 worker 会并发申请,预留足够内存


说到这里,其实最让人困扰的是这些参数的关系,单独拿出一个参数都明白是什么意思,把这堆参数放一块,很多人就开始晕,咱们今天来去把这些参数之间的关系来梳理一下。

max_worker_processes,这个参数最容易被理解错误,这个参数主要的意义是限制除了你query session外的后台程序在POSTGRESQL中运行的数量,那么这些后台程序包含什么?

一句话和客户无关的后台进程都要收到这个参数的限制,那么到底那些进程受到他的限制:

1 并行的查询工作进程(由系统发起的并行) 2 逻辑复制进程 3 自动清理进程 4 后台维护进程

那么max_worker_processes 的意义何在这是我们应该对自己管理的数据库应该提出的问题,一句话解释,防止你滥用和其他参数配置错误,导致系统无法处理这些工作而最终资源耗尽而宕机。

举例比如你进来30个查询,每个查询都要触发进行并行操作,你并行操作设置的是4,也就是会产生 30 * 4 = 并行的查询的后台进程。

我们按照每个进程可以获得 8MB的内存 120 * 8 = 8160MB 的内存使用的量,此时如果你的系统仅仅就16G的内存,那么你这里设置 max_worker_processes 合适吗? 显然是不合适的。

2 max_parallel_workers

这个参数是控制QUERY并行的时候到底可以产生多少个并行的works,这里就要考虑另一个问题,你要留下多少固定的processes 给非query的进程,一般情况下你要考虑你有没有逻辑复制,以及你的autovacuum的工作时的进程数是多少

max_parallel_workers = max_worker_processes - 固定的backgroud processes

具体多少,你就要看你的具体情况了,比如你有大量的逻辑复制,那么你这个部分就不能太多了,或者你系统的vacuum就是一个大问题,且你设置的autovacuum的工作进程数量较多,那么你也不能给max_parallel_workers 太多的数量,具体的情况就要具体的分析了,这也是和学生们要讨论和给出方案的部分。

那么如果设置不好会造成什么问题

1 查询挤压 2 内存耗尽系统OOM 3 逻辑复制挤压 4 autovacuum 无法分配进程导致dead tuple无法有效的被清理,系统性能下降。

而不足的max_parallel_workers,会导致并行查询无法获得足够的进程而无法进行并行查询。

3 max_parallel_workers_per_gather,这是今天要说的最后一个和查询有关的并行参数,这个参数是每个SQL可以使用的最大的并行度。

这三个参数是三级跳,max_worker_processes > max_parallel_workers > max_parallel_workers_per_gather

说到这里曾经有些同学认为 max_parallel_workers_per_gather 这个数量越大越好,他们认为更大的max_parallel_workers_per_gather 会然给一个SQL可以使用更多的CPU来处理一个SQL的数据,但在实际的应用中,

我们需要分清一些信息,三种典型的JOIN,并行是怎么进行应用的。

1 Hash join ,hash_join 的并行是从PG11引入的,并行的部分包含了构建hash表的工作,和后续的探查阶段的工作进程的数据量,从而加速hash join 的操作。

2 Merge_join,Merge_john 最大的需求是表和表之间的排序问题,通过对两个要进行john的表进行排序来进行比对,那么并行主要要用在表的排序中,通过在排序阶段加速来加快merge join的工作

3 Nested loop : 外表,内表,驱动表和被驱动表,或者称之为小表的大表,其实这也是一个数据的比对过程,而并行在这里进行使用的主要作用是通过对大表的并行扫描和小表的比对来加快数据的处理。

写到这里,为什么说并行太多会影响性能,我们想一个问题,并行的资源来自于数据索取后的归并,那么归并分为有序归并和无序归并,有序的归并消耗会更多,这里每个tumple在 gather merge的时候都要消耗,越多的 works并行,就会导致越多的CPU消耗,且长时间霸占,这样会导致其他的查询无法获得有效的并行,所以在有序需求场景多的地方,合理配置并行查询参数是一门功课!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-05-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AustinDatabases 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
PostgreSQL Parallel 并行 与 开源数据库
PostgreSQL 在的并行是从9.6开始的,到了目前的PostgreSQL 11 这个版本目前已经支持了partition-wise join, aggregates, 以及 Parallel Create Index 当然还是的提一下在PostgreSQL 10 已经支持的 Parallel Bitmap heap scan 和 Parallel Index Scan.
AustinDatabases
2019/06/21
1.8K0
PostgreSQL Parallel  并行 与 开源数据库
PostgreSQL 加索引系统OOM 怨我了--- 不怨你怨谁
PostgreSQL “我怎么就连个数据库都不会建?” --- 你还真不会!
AustinDatabases
2024/11/29
1160
PostgreSQL  加索引系统OOM 怨我了--- 不怨你怨谁
从零开始学PostgreSQL (十三):并行查询
并行查询是PostgreSQL提供的一种功能,它允许查询在多个CPU核心或处理器上同时执行,从而显著提高查询性能,特别是在处理大型数据集时。并行查询的设计目标是在多核处理器的现代硬件上实现更好的资源利用率,减少查询响应时间。
DBA实战
2024/09/06
1640
从零开始学PostgreSQL (十三):并行查询
PostgreSQL并行查询是个什么“鬼"?
【导语】2016年4月,PostgreSQL社区发布了PostgreSQL 9.6 Beta 1,迎来了并行查询(Parallel Query)这个新特性。在追求高性能计算和查询的大数据时代,能提升性能的特性都会成为一个新的热门话题。作为关注PostgreSQL发展的数据库开发者,本文作者将分享对于一些PostgreSQL并行查询特性相关话题的认识。 ➤并行查询的背景 随着SSD等磁盘技术的平民化,以及动辄上百GB内存的普及,I/O层面的性能问题得到了有效缓解。提升数据库的扩展性能,可以追求Scale O
CSDN技术头条
2018/02/13
4.3K0
PostgreSQL并行查询是个什么“鬼"?
史上最全PostgreSQL体系结构
墨墨导读:本文主要从日志文件、参数文件、控制文件、数据文件、redo日志(WAL)、后台进程这六个方面来讨论PostgreSQL的结构。
数据和云
2019/07/22
4.1K0
史上最全PostgreSQL体系结构
PostgreSQL核心揭秘(二)-进程和内存架构
PostgreSQL 的进程架构采用了一个多进程的设计,这使其能够有效地管理并发连接和资源。以下是 PostgreSQL 的主要进程架构组成部分的详细描述:
DBA实战
2024/10/31
3490
PostgreSQL核心揭秘(二)-进程和内存架构
Postgresql源码(109)并行框架实例与分析
并行计划没有什么特殊的地方,并行逻辑基本都在ExecGather函数中实现的:
mingjie
2023/10/13
4730
Postgresql源码(109)并行框架实例与分析
【TBase开源版测评】Hello, TBase
TBase是腾讯基于PostgreSQL研发的一个分布式HTAP数据库,适用于拥有海量数据、高并发、部分分析场景解决,以及分布式事务能力的应用场景。 从现有的资料来看,TBase本身在腾讯内部是经过业务长期迭代打磨的产品,目前在腾讯云上也提供商业化的版本销售。
HappenLee
2020/08/28
2.5K1
【TBase开源版测评】Hello, TBase
进阶数据库系列(二十三):PostgreSQL 性能优化
PostgreSQL数据库优化是多方面的,原则是减少系统的瓶颈,减少资源的占用,增加系统的反应速度。例如:
民工哥
2023/08/22
4.1K0
进阶数据库系列(二十三):PostgreSQL 性能优化
数据库PostrageSQL-服务器配置资源消耗
shared_buffers (integer) 设置数据库服务器将使用的共享内存缓冲区量。默认通常是 128 兆字节(128MB),但是如果你的内核设置不支持(在initdb时决定),那么可以会更少。这个设置必须至少为 128 千字节(BLCKSZ的非默认值将改变最小值)。不过为了更好的性能,通常会使用明显高于最小值的设置。
cwl_java
2020/10/15
1.6K0
POSTGRESQL MYSQL MONGODB 配置文件总结(感谢我的三个DBA)
最近在整理POSTGRESQL MYSQL MONGODB REDIS 的标准化模板配置参数,当然这里面还包含 LINUX 的一些基本配置. 相关的整理的工作是我的三个 DBA 操作的, 针对目前的参数进行了相关的整理和重新设定. 昨天有人问我要,这边进贴出来,如果大家有什么问题 ,告诉我们, 大家一起进步.
AustinDatabases
2021/02/26
8310
PolarDB 并行黑科技--从百套MySQL撤下说起
使用PolarDB-M(PolarDB for MySQL)已经有3年的时间了,作为PolarDB 非官方专业的技术传播渠道也有一段时间。替换MySQL到PolarDB-M,从当初的架构师,开发对这个云原生数据库的质疑,到现在一百多套的MySQL都消失了,拔地而起的一百多套的PolarDB-M,过程重要,结果也重要,其实都重要,如果没有结果,那么过程的目的又是什么。
AustinDatabases
2024/11/25
2030
PolarDB 并行黑科技--从百套MySQL撤下说起
【Tbase开源版测评】基于PostgreSQL的国产开源数据库初体验
之前本人主要使用过oracle,mysql,greenplum,tdsql,tidb等数据库。头一次接触基于PostgreSQL的国产开源数据库,如果如下内容有错误的地方,还希望各位朋友批评指正。
卖菜小弟
2020/08/15
2.9K4
PgSQL-并行查询系列-介绍[译]
现代CPU模型拥有大量的CPU核心。多年来,数据库应用程序都是并发向数据库发送查询的。查询处理多个表的行时,若可以使用多核,则可以客观地提升性能。PgSQL 9.6引入了并行查询的新特性,开启并行查询后可以大幅提升性能。
yzsDBA
2023/09/07
4010
PgSQL-并行查询系列-介绍[译]
Postgresql进程与内存结构
Postgresql使用多进程架构实现(Mysql为多线程),PG启动时会拉起守护进程,然后由守护进程fork相关的后台辅助进程。守护进程的另一个作用是监听客户端的连接请求,当client发起连接时,守护进程会fork服务进程来处理client发送过来的命令,每有一个连接,后台就会存在一个服务进程。
mingjie
2022/05/12
9210
Postgresql进程与内存结构
PostgreSQL集群篇——PostgreSQL的配置文件解析
日常中我们进行安装PostgreSQL后都需要对其进行配置基础配置,以便其能有效发挥出服务器的性能,下面是我进行整理后的postgresql.conf配置文件的相关注释,方便大家对于各个属性进行熟悉。
cn華少
2021/07/27
3.9K0
POSTGRESQL 怎么通过explain 来分析SQL查询性能
explain select a.first_name,a.last_name,a.last_update,fa.film_id from film_actor as fa right join actor as a on fa.actor_id = a.actor_id where fa.actor_id < 6;
AustinDatabases
2021/09/02
4.5K0
PostgreSQL 查询语句开发写不好是必然,不是PG的锅
当时指出了一些问题,基于时间的原因知道有问题,但没有说出具体的问题,当时也提到这样写语句,数据库基本上无法走执行计划,因为没有统计分析。
AustinDatabases
2024/01/26
1820
PostgreSQL  查询语句开发写不好是必然,不是PG的锅
从零开始学PostgreSQL (二): 配置文件
PostgreSQL 使用三个主要的配置文件来控制服务器的行为、网络访问和用户映射。下面是对这三个文件的详细介绍:
DBA实战
2024/09/06
6640
从零开始学PostgreSQL (二): 配置文件
How to Optimize PostgreSQL Logical Replication
逻辑复制(Logical Replication)或Pglogical是表级别的复制。两者都是基于WAL的复制机制,允许在两个实例之间复制指定表的WAL。这两个看起来让人迷惑,到底有什么区别呢?Logical Replication是PostgreSQL10.0引入的内置新特性,而pglogical则是一个插件。PG10版本之前可以使用该插件进行逻辑复制,通过持续发展,pglogical的所有特性都集成到了Logical Replication中。换句话说,pglogical插件变成了Logical Replication。Logical Replication最基本的优势在于不用安装任何插件,安装插件受限的环境中,可以推荐使用该逻辑复制。
yzsDBA
2020/10/28
8990
How to Optimize PostgreSQL Logical Replication
推荐阅读
相关推荐
PostgreSQL Parallel 并行 与 开源数据库
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档