怎样在PostgreSQL 16中利用并行查询加速SQL聚合?

浅丽吖_9139

浅丽吖_9139

2026-09-03

385人浏览

原创

postgresql 16并行聚合需满足函数支持partial mode、数据量超阈值、无volatile函数等条件;手动调优参数如max_parallel_workers_per_gather和min_parallel_table_scan_size,并确保explain中出现gather节点方可生效。

怎样在postgresql 16中利用并行查询加速sql聚合?

PostgreSQL 16 的并行查询不会自动加速任意 GROUP BY 或聚合语句——它只对满足特定条件的查询生效,且必须手动调优参数才能触发。盲目套用并行配置反而可能因调度开销拖慢小表查询。

为什么 EXPLAIN 看不到 Gather 节点?

即使启用了并行参数,EXPLAIN ANALYZE 仍显示 GroupAggregate 而非 Gather + Partial Aggregate,常见原因包括:

  • 聚合函数不支持 Partial Mode:例如 count(distinct col)string_agg(col, ',' ORDER BY x)avg(col)(16 之前版本)会直接禁用并行
  • 扫描数据量低于阈值:min_parallel_table_scan_size 默认为 8MB,若实际扫描远小于此(如几万行小表),优化器跳过并行路径
  • 存在 volatile 函数:string_agg(now()::text, ',')random() 等调用会让整个计划退化为串行
  • 查询含隐式禁止操作:如 FOR UPDATE、某些窗口函数、或在 plpgsql 函数中使用 PERFORM / SELECT INTO 中间赋值

哪些聚合写法真能并行?

只有满足「可分片 + 可合并」条件的组合才可能触发并行。关键看聚合函数是否实现 combine/serial/deserial 接口:

腾讯会议AI小助手
腾讯会议AI小助手

腾讯会议AI小助手是一款AI办公效率工具,腾讯会议推出的AI会议内容助理。

下载
  • string_agg(col, ',') —— 必须无 ORDER BY;带排序即失效
  • array_agg(col)jsonb_agg(col)json_agg(col) —— 同样禁止 ORDER BY
  • sum(col)max(col)min(col)count(*) —— 支持;但 count(col)(非星号)和 count(distinct col) 不支持
  • GROUP BY 字段本身不能含 volatile 表达式,例如 GROUP BY date_trunc('day', now()) 会阻断并行

如何让并行真正生效?

必须在查询执行前设置 session 级参数,推荐在函数内用 SET LOCAL 隔离作用域:

  • 设 worker 数:SET LOCAL max_parallel_workers_per_gather = 4;(建议 ≤ CPU 核心数)
  • 调低门槛:SET LOCAL min_parallel_table_scan_size = 1MB;(仅测试用;生产按实际表大小设,如 100MB)
  • 压低成本估算:SET LOCAL parallel_setup_cost = 2;SET LOCAL parallel_tuple_cost = 0.01;
  • 确保内存充足:SET LOCAL work_mem = '64MB';(总内存 ≈ (1 + workers) × work_mem)
  • 验证是否启用:EXPLAIN (ANALYZE, VERBOSE) 输出中出现 Gather 节点,且子节点含 Partial Aggregate

在 plpgsql 函数里怎么写才不破坏并行?

函数封装本身不阻止并行,但常见写法会意外关闭它:

  • 避免 RETURN QUERY SELECT ... GROUP BY ... 中嵌套 volatile 表达式或 ORDER BY 子句
  • 不要用 FOR rec IN SELECT ...SELECT ... INTO var 包裹聚合查询——这会触发 planner early-exit,跳过并行候选路径
  • 如果必须用中间变量,改用 WITH CTE 提前物化,再对其聚合(CTE 本身不阻断并行)
  • SET LOCAL 参数在函数内有效,但若函数内开了 BEGIN ... END 事务块,这些设置仍持续到块结束

最容易被忽略的是:并行与否完全由查询计划决定,跟是不是在函数里、有没有加 PARALLEL SAFE 属性无关;哪怕所有参数都设对了,一行 ORDER BY 或一个 now() 就能让整个并行计划消失。

相关专题

更多
大数据分析工具有哪四个
大数据分析工具有哪四个

大数据分析的四个工具分别是rapidminer、Hpcc、Hadoop和Pentaho bi。大数据分析用于从各种来源生成的原始数据中提取有价值的数据。这些数据帮助我们获得有意义的见解、隐藏的模式、未知的相关性、市场趋势等等,具体取决于行业。大数据分析的主要动机是提供有价值的见解,以便为未来做出更好的决策。php中文网为大家带来了大数据分析的相关教程、以及相关文章等内容,供大家免费下载使用。

2023.06.21

4056

5

Java 大数据处理基础(Hadoop 方向)
Java 大数据处理基础(Hadoop 方向)

本专题聚焦 Java 在大数据离线处理场景中的核心应用,系统讲解 Hadoop 生态的基本原理、HDFS 文件系统操作、MapReduce 编程模型、作业优化策略以及常见数据处理流程。通过实际示例(如日志分析、批处理任务),帮助学习者掌握使用 Java 构建高效大数据处理程序的完整方法。

2025.12.08

1209

12

大数据专业学习教程
大数据专业学习教程

本专题整合了大数据专业学习相关教程,阅读专题下面的文章了解更多详细内容。

2026.01.05

203

5

python处理大数据合集
python处理大数据合集

本专题整合了python处理大数据相关教程,阅读专题下面的文章了解更多详细内容。

2026.01.05

426

22

postgresql常用命令
postgresql常用命令

postgresql常用命令psql、createdb、dropdb、createuser、dropuser、\l、\c、\dt、\d table_name、\du、\i file_name、\e和\q等。本专题为大家提供postgresql相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.10

193

5

常用的数据库软件
常用的数据库软件

常用的数据库软件有MySQL、Oracle、SQL Server、PostgreSQL、MongoDB、Redis、Cassandra、Hadoop、Spark和Amazon DynamoDB。更多关于数据库软件的内容详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.02

4029

19

postgresql常用命令有哪些
postgresql常用命令有哪些

postgresql常用命令psql、createdb、dropdb、createuser、dropuser、\l、\c、\dt、\d table_name、\du、\i file_name、\e和\q等。更详细的postgresql常用命令,大家可以访问下面的文章。

2023.11.16

607

3

postgresql常用命令介绍
postgresql常用命令介绍

postgresql常用命令有\l、\d、\d5、\di、\ds、\dv、\df、\dn、\db、\dg、\dp、\c、\pset、show search_path、ALTER TABLE、INSERT INTO、UPDATE、DELETE FROM、SELECT等。想了解更多postgresql的相关内容,可以阅读本专题下面的文章。

2023.11.20

1356

6

PostgreSQL性能优化与索引调优实战
PostgreSQL性能优化与索引调优实战

本专题面向后端开发与数据库工程师,深入讲解 PostgreSQL 查询优化原理与索引机制。内容包括执行计划分析、常见索引类型对比、慢查询优化策略、事务隔离级别以及高并发场景下的性能调优技巧。通过实战案例解析,帮助开发者提升数据库响应速度与系统稳定性。

2026.02.12

420

19

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.6万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.1万人学习