
GROUP BY CUBE 会生成所有可能的维度组合(即幂集),包括空集(全表聚合),因此汇总结果行数 = 2n(n 为分组字段数)。它比普通 GROUP BY 或 ROLLUP 更全面,但代价是存储和计算开销显著上升。
全维度汇总:到底生成哪些分组?
CUBE 对所有指定列做“是否参与分组”的穷举。例如:
SELECT a, b, c, SUM(sales) FROM t GROUP BY CUBE(a, b, c);
实际等价于同时执行以下 8 种分组(2³=8):
- GROUP BY a, b, c(最细粒度)
- GROUP BY a, b(c 被忽略)
- GROUP BY a, c(b 被忽略)
- GROUP BY b, c(a 被忽略)
- GROUP BY a(b、c 都被忽略)
- GROUP BY b
- GROUP BY c
- GROUP BY ()(无分组,全表 SUM)
每种组合都独立计算聚合值,结果集中用 NULL 表示该维度未参与分组(如 (1, NULL, 5) 表示按 a=1、c=5 分组,b 被“立方”忽略)。
存储开销:行数爆炸与重复计算
原始数据 N 行,CUBE 输出最多 2n ×(不同组合的实际基数)行。关键影响因素:
- 维度基数高 → 结果膨胀更剧烈:若 a 有 100 值、b 有 50 值、c 有 10 值,理论上最大输出行数 ≈ 100×50×10 × 2³ = 4 百万行(远超原始数据量)
- NULL 值多 → 物理存储冗余增大:每个非参与维度填 NULL,宽表 + 大量 NULL 会增加页内碎片和压缩效率损失
- 无法复用中间结果:多数数据库(如 PostgreSQL、SQL Server)不自动优化 CUBE 的子分组复用,导致多次扫描或哈希构建,内存/临时空间压力大
替代方案:按需取舍,控制开销
并非所有场景都需要完整 CUBE。可考虑更轻量的组合:
- 用 GROUP BY ROLLUP(a,b,c) 只生成层级前缀组合(a,b,c;a,b;a;()),共 n+1 种,开销低得多
- 显式写出关键分组 UNION ALL(如只想要 (a,b)、(a)、() 三种),避免无关组合计算
- 预计算高频组合到物化视图/汇总表中,查询时直接命中,绕过实时 CUBE 开销
- 在应用层分步聚合:先算明细,再用程序合并维度,适合维度少、逻辑灵活的场景
小结:CUBE 是能力与代价的平衡
它提供最完整的多维透视能力,适合探索性分析或固定报表模板。但上线前务必评估维度数量(建议 ≤ 4)、各列基数及目标数据量级。超过阈值时,应优先裁剪维度或改用增量/分治策略。不复杂但容易忽略。










