

新闻资讯
技术教程SQL聚合底层主要有Hash Aggregate和Sort-Aggregate两种策略:前者基于哈希表,适合高基数、无序输入,内存充足时高效但输出无序;后者先排序再扫描,适合低基数、已排序输入或需有序输出,内存可控且结果天然有序。
在SQL数据库中,聚合操作(如 GROUP BY、SUM、COUNT 等)的底层实现通常依赖两种主流策略:基于哈希的聚合(Hash Aggregate)和基于排序的聚合(Sort-Aggregate)。二者核心差异在于数据组织方式与适用场景,直接影响性能、内存消耗和结果有序性。
哈希聚合通过构建哈希表来归集相同键值的行,对每个键维护一个聚合状态(如累加器、计数器)。它不要求输入有序,可流式处理,适合中间结果无序或无法提前排序的情况。
键字典序无关HashAggregate)、SQL Server(Hash Match Aggregate)、ClickHouse(AggregatingHash)排序聚合先按分组键排序,再顺序扫描——相同键必然相邻,只需一次遍历即可完成累加。它天然依赖排序稳定性,也常复用已存在的索引排序或上游排序算子。
ORDER BY
优化器不会凭空决策,而是结合统计信息(如分组键的NDV——唯一值数量)、可用内存、输入是否有序、是否需要输出排序等综合判断。
虽然多数现代数据库自动选择,但在特定场景下可通过Hint或配置引导:
SET enable_hashagg = off 强制禁用哈希聚合OPTION (HASH GROUP) 或 OPTION (ORDER GROUP)
GROUP BY 后加 WITH TOTALS 或调整 max_bytes_before_external_group_by 控制哈希溢出阈值HashAggregate、SortAggregate、StreamingAgg(表示输入已排序)等节点名称