




SQL聚合操作执行路径分单阶段与多阶段,取决于数据规模、并行能力、内存限制及优化器决策;单阶段在单节点完成哈希聚合,适用于小数据;多阶段含Partial与Final聚合,用于分布式或大数据场景。
SQL数据库中的聚合操作(如 COUNT、SUM、GROUP BY)执行路径是否走单阶段还是多阶段,主要取决于数据规模、并行能力、内存限制以及查询优化器的决策,而非语法本身。
单阶段聚合指所有分组与计算在同一个执行节点(或单个算子)中完成,通常适用于小数据集或本地执行场景。
SET parallel_setup_cost = 999999)多阶段聚合将聚合拆分为局部聚合(Partial Aggregate)和全局聚合(Final Aggregate)两个及以上阶段,常见于分布式或并行查询引擎(如 PostgreSQL 并行查询、Spark SQL、Presto/Trino、ClickHouse)。
各 worker 独立扫描数据分片,对本地数据做初步聚合(如 COUNT(*) → COUNT(*)_partial)SUM(count_partial))GROUP BY 场景,缓解 shuffle 压力优化器不会随意选择阶段数,而是基于代价模型权衡。以下因素直接影响判断:
max_parallel_workers_per_gather > 0 且表足够大时,GROUP BY 可能自动转为 partial + finalSUM、COUNT、MAX)天然支持多阶段;不可分割的(如 STRING_AGG(DISTINCT ...) 或窗口函数嵌套)往往退回到单阶段work_mem 不足,即使想单阶段也会 fallback 到两阶段磁盘哈希通过执行计划确认是否启用多阶段,重点关注节点名称与重分布操作:
EXPLAIN (ANALYZE, VERBOSE) 中出现 Partial Aggregate + Gather + Final Aggregate
EXPLAIN PIPELINE 显示 AggregatingTransform 出现在多个 processor 阶段HashAggregate(partial)→ Exchange(shuffle)→ HashAggregate(final)Repartition、Shuffle、Distribution 等关键词,它们是多阶段的明确信号