讲师中心 微信公众号
AI工具推荐 视频效率加速

如何在PostgreSQL 14中用GROUP BY加速千万级统计?

梦芳君_5644

梦芳君_5644

发布时间:2026-10-05 08:43:48

|

605人浏览过

|

来源于php中文网

原创

PostgreSQL 14 中 GROUP BY 性能提升关键在 work_mem 配置、分组键设计及并行扫描配合;盲目建索引或调全局参数反而损害性能。

如何在postgresql 14中用group by加速千万级统计?

PostgreSQL 14 的 GROUP BY 本身不加速,真正起效的是 work_mem 配置 + 合理分组键设计 + 并行扫描配合;盲目建索引或改全局参数反而容易拖垮整体性能。

为什么调大 work_mem 能让 GROUP BY 快起来

GROUP BY 在 PostgreSQL 中默认走哈希聚合(HashAggregate)或排序聚合(Sort + GroupAggregate),两者都强依赖内存。一旦中间结果集超出 work_mem 限制,就会写临时文件到磁盘——IO 开销比内存操作高 2–3 个数量级。

实操建议:

  • 先用 EXPLAIN (ANALYZE, BUFFERS) 看执行计划,重点找 HashAggregate 或 Sort 节点下的 Disk Usage 字段:只要 > 0,就说明已落盘
  • 在业务查询前加 SET LOCAL work_mem = '32MB'(别用 SET work_mem 全局改)
  • 估算下限:若分组后结果约 50 万行,键字段平均长度 16 字节,预留 1.5 倍膨胀,work_mem 至少设为 '12MB'
  • 别超过 '128MB' 单次设置,尤其在连接池 > 30 的服务上,否则可能触发系统 swap

GROUP BY 分组键怎么选才不拖慢查询

PostgreSQL 的 GROUP BY 不像 MySQL 那样能靠索引“跳着读”,但它对分组键的区分度和宽度极度敏感:键越宽、值越重复,哈希桶越多、内存占用越大、缓存局部性越差。

实操建议:

  • 避免直接用 user_agent、url、ip 这类长文本字段分组;先提取特征(如 substr(user_agent, 1, 32))或映射成 ID(如 ua_id)
  • 多列分组时,把高基数列(如 region)放前面,低基数列(如 status)放后面,利于哈希分布更均匀
  • 确认 n_distinct 统计是否准确:查 SELECT n_distinct FROM pg_stats WHERE tablename = 'logs' AND attname = 'service';若为 -1(全唯一)但实际只有几十个取值,说明需 ANALYZE logs
  • 不用 WITH ROLLUP,它在千万级原始数据上极易生成百万级中间汇总行;真要下钻,拆成两层查询更稳

并行查询要不要开?怎么开才安全

PostgreSQL 14 默认允许并行,但是否启用取决于优化器成本估算。对 GROUP BY 类聚合,并行主要加速前期扫描阶段,后续哈希/排序仍串行——所以收益有上限,但确实可观。

实操建议:

  • 确认表大小超阈值:查 pg_total_relation_size('logs'),若 > 32MB,max_parallel_workers_per_gather 才可能生效
  • 会话级开启更可控:SET LOCAL max_parallel_workers_per_gather = 3(设为 CPU 核数减 1)
  • 同步调低成本参数防误判:SET LOCAL parallel_setup_cost = 200、SET LOCAL parallel_tuple_cost = 0.02
  • 禁用某次查询的并行(比如你发现它抢光了内存):SET LOCAL max_parallel_workers_per_gather = 0

时间字段分组总出错?UTC 是唯一解

日志表里 created_at 是 TIMESTAMP WITHOUT TIME ZONE,但应用写入时用的是东八区时间,而数据库服务器时区是 UTC——这时 GROUP BY DATE(created_at) 会把凌晨 00:00–00:59 的记录全算进前一天。

实操建议:

  • 永远别信服务器本地时区,统一转 UTC 后再分组:GROUP BY DATE(created_at AT TIME ZONE 'UTC')
  • 如果字段是 TIMESTAMP WITH TIME ZONE,确保写入时已带时区信息(如 '2026-09-28 00:30:00+08'),否则 AT TIME ZONE 无意义
  • 建表达式索引加速:CREATE INDEX idx_logs_date_utc ON logs ((created_at AT TIME ZONE 'UTC')::DATE),注意括号不能少
  • 验证时区一致性:SELECT current_setting('timezone'), now(), now() AT TIME ZONE 'UTC'

最易被忽略的一点:GROUP BY 的性能瓶颈往往不在 SQL 写法本身,而在 work_mem 和统计信息这两层“看不见的配置”。一次 ANALYZE 加一次会话级 SET LOCAL,有时比重写十次查询更管用。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

相关专题

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

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

4536

2023.06.21

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

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

1229

2025.12.08

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

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

223

2026.01.05

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

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

466

2026.01.05

postgresql常用命令
postgresql常用命令

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

213

2023.10.10

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

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

4289

2023.11.02

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

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

627

2023.11.16

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的相关内容,可以阅读本专题下面的文章。

1376

2023.11.20

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

80

2026.09.30

热门下载

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

精品课程

更多
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn