SQL数据库聚合执行路径_单阶段与多阶段

发布时间 - 2026-01-10 00:00:00    点击率:
SQL聚合操作执行路径分单阶段与多阶段,取决于数据规模、并行能力、内存限制及优化器决策;单阶段在单节点完成哈希聚合,适用于小数据;多阶段含Partial与Final聚合,用于分布式或大数据场景。

SQL数据库中的聚合操作(如 COUNTSUMGROUP BY)执行路径是否走单阶段还是多阶段,主要取决于数据规模、并行能力、内存限制以及查询优化器的决策,而非语法本身。

单阶段聚合执行路径

单阶段聚合指所有分组与计算在同一个执行节点(或单个算子)中完成,通常适用于小数据集或本地执行场景。

  • 典型场景:表数据量小(如万级以下)、无分布式环境(如 SQLite、单机 MySQL)、或显式禁用并行(SET parallel_setup_cost = 999999
  • 执行流程:扫描全表 → 建立哈希表(key=分组列,value=聚合值)→ 一次遍历完成累加 → 输出结果
  • 优势是延迟低、无网络/序列化开销;但易受内存限制,大数据量下可能触发磁盘哈希(spill),反而变慢

多阶段聚合执行路径

多阶段聚合将聚合拆分为局部聚合(Partial Aggregate)和全局聚合(Final Aggregate)两个及以上阶段,常见于分布式或并行查询引擎(如 PostgreSQL 并行查询、Spark SQL、Presto/Trino、ClickHouse)。

  • 第一阶段(Partial):各 worker 独立扫描数据分片,对本地数据做初步聚合(如 COUNT(*) → COUNT(*)_partial
  • 第二阶段(Merge/Final):将各 partial 结果按 group key 重新分发(Shuffle),再合并(如 SUM(count_partial)
  • 部分引擎支持三阶段(如先 local + shuffle + final),用于高基数 GROUP BY 场景,缓解 shuffle 压力

影响执行路径的关键因素

优化器不会随意选择阶段数,而是基于代价模型权衡。以下因素直接影响判断:

  • 数据分布与分组基数:低基数(如按“省份”分组)倾向单阶段;高基数(如按“用户ID”分组且亿级)更可能启用多阶段避免内存爆炸
  • 并行度配置:PostgreSQL 中 max_parallel_workers_per_gather > 0 且表足够大时,GROUP BY 可能自动转为 partial + final
  • 聚合函数性质:可分割聚合(SUMCOUNTMAX)天然支持多阶段;不可分割的(如 STRING_AGG(DISTINCT ...) 或窗口函数嵌套)往往退回到单阶段
  • 内存与 work_mem 设置:PostgreSQL 中若 work_mem 不足,即使想单阶段也会 fallback 到两阶段磁盘哈希

如何观察实际执行路径

通过执行计划确认是否启用多阶段,重点关注节点名称与重分布操作:

  • PostgreSQL:EXPLAIN (ANALYZE, VERBOSE) 中出现 Partial Aggregate + Gather + Final Aggregate
  • ClickHouse:EXPLAIN PIPELINE 显示 AggregatingTransform 出现在多个 processor 阶段
  • Spark SQL:物理计划含 HashAggregate(partial)→ Exchange(shuffle)→ HashAggregate(final)
  • 注意 RepartitionShuffleDistribution 等关键词,它们是多阶段的明确信号


# mysql  # 大数据  # ai  # cos  # 聚合函数  # gate  # sql  # 分布式  # count  # sqlite  # spark  # postgresql  # 数据库  # clickhouse  # 关键词  # 适用于  # 也会  # 多个  # 出现在  # 遍历  # 而非  # 不可分割  # 数据库中  # 重点关注 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 简历没回改:利用AI润色让你的文字更专业  如何选择PHP开源工具快速搭建网站?  Laravel如何使用查询构建器?(Query Builder高级用法)  头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?  如何撰写建站申请书?关键要点有哪些?  如何制作一个表白网站视频,关于勇敢表白的小标题?  laravel怎么配置Redis作为缓存驱动_laravel Redis缓存配置教程  Java类加载基本过程详细介绍  Win11搜索栏无法输入_解决Win11开始菜单搜索没反应问题【技巧】  Laravel观察者模式如何使用_Laravel Model Observer配置  Laravel如何创建自定义Artisan命令?(代码示例)  使用Dockerfile构建java web环境  UC浏览器如何切换小说阅读源_UC浏览器阅读源切换【方法】  rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted  悟空识字怎么关闭自动续费_悟空识字取消会员自动扣费步骤  Laravel怎么实现搜索高亮功能_Laravel结合Scout与Algolia全文检索【实战】  宙斯浏览器文件分类查看教程 快速筛选视频文档与图片方法  胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?  Laravel Session怎么存储_Laravel Session驱动配置详解  Laravel如何实现本地化和多语言支持?(i18n教程)  js实现点击每个li节点,都弹出其文本值及修改  动图在线制作网站有哪些,滑动动图图集怎么做?  电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?  Laravel如何实现一对一模型关联?(Eloquent示例)  如何快速配置高效服务器建站软件?  东莞专业网站制作公司有哪些,东莞招聘网站哪个好?  如何自定义建站之星网站的导航菜单样式?  高端云建站费用究竟需要多少预算?  如何在IIS管理器中快速创建并配置网站?  Laravel如何设置自定义的日志文件名_Laravel根据日期或用户ID生成动态日志【技巧】  详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)  济南网站建设制作公司,室内设计网站一般都有哪些功能?  Laravel怎么做数据加密_Laravel内置Crypt门面的加密与解密功能  Laravel如何安装Breeze扩展包_Laravel用户注册登录功能快速实现【流程】  html5audio标签播放结束怎么触发事件_onended回调方法【教程】  如何用AWS免费套餐快速搭建高效网站?  Laravel定时任务怎么设置_Laravel Crontab调度器配置  在线制作视频的网站有哪些,电脑如何制作视频短片?  如何用y主机助手快速搭建网站?  消息称 OpenAI 正研发的神秘硬件设备或为智能笔,富士康代工  Laravel怎么使用Session存储数据_Laravel会话管理与自定义驱动配置【详解】  ChatGPT 4.0官网入口地址 ChatGPT在线体验官网  Python自然语言搜索引擎项目教程_倒排索引查询优化案例  Swift中循环语句中的转移语句 break 和 continue  如何破解联通资金短缺导致的基站建设难题?  jquery插件bootstrapValidator表单验证详解  Python正则表达式进阶教程_复杂匹配与分组替换解析  高端建站三要素:定制模板、企业官网与响应式设计优化  Python企业级消息系统教程_KafkaRabbitMQ高并发应用  Laravel如何为API生成Swagger或OpenAPI文档