导读:本期聚焦于小伙伴创作的《SQL GROUPING SETS 的多维聚合与 ROLLUP 等价写法如何优化》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《SQL GROUPING SETS 的多维聚合与 ROLLUP 等价写法如何优化》有用,将其分享出去将是对创作者最好的鼓励。

SQL中的GROUPING SETS和ROLLUP都是用于实现多维聚合的语法,二者存在明确的等价转换关系,合理运用等价写法并优化可以大幅提升复杂统计查询的性能。

SQL GROUPING SETS 的多维聚合与 ROLLUP 等价写法如何优化

GROUPING SETS与ROLLUP的基础语法

ROLLUP是GROUPING SETS的简化写法,用于生成层级式的聚合结果。比如对维度a、b做ROLLUP,等价于指定多组聚合维度组合。以下是二者的基础语法示例:

-- ROLLUP基础写法
SELECT a, b, SUM(c) AS total
FROM test_table
GROUP BY ROLLUP(a, b);

-- 等价的GROUPING SETS写法
SELECT a, b, SUM(c) AS total
FROM test_table
GROUP BY GROUPING SETS(
    (a, b),  -- 同时聚合a和b
    (a),     -- 仅聚合a
    ()       -- 全表聚合
);

ROLLUP转GROUPING SETS的等价规则

ROLLUP的维度列表有n个字段时,会生成n+1组聚合组合,对应GROUPING SETS的写法需要包含所有层级的组合:

  • 第1组:所有n个维度都参与聚合
  • 第2组:前n-1个维度参与聚合
  • 以此类推,直到仅第1个维度参与聚合
  • 最后一组:空组合,即全表聚合

比如3个维度的ROLLUP(a,b,c)等价于GROUPING SETS((a,b,c),(a,b),(a),()),可以通过如下代码验证结果一致性:

-- 3维度ROLLUP
SELECT a, b, c, SUM(d) AS total
FROM sales
GROUP BY ROLLUP(a, b, c)
ORDER BY a, b, c;

-- 等价的GROUPING SETS
SELECT a, b, c, SUM(d) AS total
FROM sales
GROUP BY GROUPING SETS((a,b,c),(a,b),(a),())
ORDER BY a, b, c;

等价写法的优化技巧

1. 减少不必要的聚合组合

如果业务中不需要全表聚合或者某层级的聚合结果,可以在转换GROUPING SETS时去掉对应组合,减少计算量。比如只需要(a,b,c)和(a,b)两层的聚合,就不需要写(a)和()的组合:

-- 优化后的GROUPING SETS,仅保留需要的聚合组合
SELECT a, b, c, SUM(d) AS total
FROM sales
GROUP BY GROUPING SETS((a,b,c),(a,b));

2. 配合GROUPING函数过滤结果

GROUPING函数可以判断某维度是否为聚合列,返回1表示当前行是该维度的聚合结果,0表示是原始分组值。可以用它过滤不需要的聚合行,减少返回数据量:

SELECT 
    a, 
    b, 
    c, 
    SUM(d) AS total,
    GROUPING(a) AS is_a_agg,
    GROUPING(b) AS is_b_agg,
    GROUPING(c) AS is_c_agg
FROM sales
GROUP BY GROUPING SETS((a,b,c),(a,b),(a),())
-- 过滤掉全表聚合的行
HAVING GROUPING(a) = 0 OR GROUPING(b) = 0;

3. 索引优化

多维聚合查询的性能很大程度依赖索引,建议根据聚合维度的使用频率创建组合索引。比如常用的聚合组合是(a,b,c)和(a,b),可以创建索引idx_sales_a_b_c

-- 创建组合索引优化聚合查询
CREATE INDEX idx_sales_a_b_c ON sales(a, b, c, d);

索引包含聚合用到的所有字段时,数据库可以直接使用索引完成聚合,避免全表扫描。

4. 执行计划分析

转换写法后可以通过EXPLAIN查看执行计划,确认是否使用了索引,是否存在不必要的排序操作。如果ROLLUP写法生成了额外的排序步骤,而GROUPING SETS写法可以避免,就可以选择后者提升性能。

-- 查看GROUPING SETS写法的执行计划
EXPLAIN
SELECT a, b, c, SUM(d) AS total
FROM sales
GROUP BY GROUPING SETS((a,b,c),(a,b),(a),());

注意事项

不同数据库对GROUPING SETS和ROLLUP的支持略有差异,比如MySQL从8.0版本开始支持这两个语法,低版本无法使用。转换写法时需要先确认当前数据库版本是否兼容,避免语法错误。另外等价写法的结果顺序可能略有不同,如果需要固定顺序要额外加ORDER BY子句。

SQLGROUPING_SETSROLLUP多维聚合查询优化修改时间:2026-07-15 08:15:32

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。