Apache Doris 多维分析实战:ROLLUP/CUBE/GROUPING SETS
一、前言:为什么需要Doris多维分析?
1.1 传统多维统计的痛点
在日常数据分析工作中,我们经常需要对数据进行多维度、多粒度聚合,例如:按日期、地区、品类统计销售额,同时需要汇总日、周、月、全量、单维度、多维度组合的统计结果。
传统实现方式是编写多条聚合SQL,通过 UNION ALL 拼接结果,存在三大致命问题:
-
代码冗余:维度组合越多,SQL代码量成倍激增,维护成本极高;
-
性能低效:多次扫描底层数据表,IO开销大,亿级数据查询延迟高;
-
扩展性差:新增统计维度、统计粒度,需要重写整套SQL,无法快速适配业务变更。
1.2 Doris多维分析的核心优势
Apache Doris 作为高性能 MPP 实时 OLAP 引擎,原生扩展了 GROUP BY 多维聚合语法,彻底解决传统统计方案的痛点,核心优势如下:
-
极简SQL:单条SQL替代数十条UNION ALL聚合语句,代码简洁易维护;
-
高性能扫描:单次扫描底层数据,计算多维度聚合结果,大幅降低IO与计算开销;
-
灵活适配 :支持自定义维度组合、全维度组合、层级上卷聚合,适配所有多维报表场景;
-
实时性强:结合Doris实时写入能力,支持增量数据实时多维统计,秒级响应查询。
二、Doris多维分析核心原理
Doris 多维分析本质是对标准 SQL GROUP BY 的语法扩展,核心是一次分组计算,生成多粒度聚合结果,语义等价于多条聚合SQL的 UNION ALL,但底层仅执行一次数据扫描与计算,是空间换时间的经典OLAP优化方案。
其底层执行逻辑:
-
FE 解析多维聚合SQL,拆解所有需要计算的维度组合;
-
生成统一的分布式执行计划,下发至所有 BE 节点;
-
BE 节点并行扫描列式存储数据,批量完成多维度聚合计算;
-
FE 汇总所有节点结果,统一返回多粒度统计数据。
同时 Doris 结合列式存储、向量化执行、预聚合Rollup表能力,进一步放大多维查询性能,轻松支撑亿级、十亿级数据实时多维分析。
三、三大多维聚合语法详解(核心)
Doris 提供三种核心多维聚合语法,分别适配不同业务场景,三者能力层层递进、各有侧重,下面结合业务场景逐一拆解。
3.1 GROUPING SETS:自定义维度组合聚合
核心定义:手动指定需要聚合的维度组合,仅计算用户定义的粒度结果,精准适配定制化多维统计场景,是最灵活的多维聚合语法。
适用场景:无需全量维度组合,仅需要特定维度、特定组合的统计数据,减少无效计算。
语法格式:
SELECT 维度字段, 聚合函数(指标) FROM 表名 GROUP BY GROUPING SETS (维度组合1,维度组合2,...);
3.2 ROLLUP:层级上卷聚合(层级汇总)
核心定义:根据维度顺序,从细粒度到粗粒度逐层上卷聚合,生成层级化汇总数据,维度顺序决定聚合层级。
聚合规则:维度(a,b,c) ROLLUP 会依次聚合:(a,b,c) → (a,b) → (a) → 全量汇总,实现从明细到总览的层级统计。
适用场景:具有层级关系的维度统计,例如:时间(年-月-日)、地区(国家-省份-城市)、品类(一级类目-二级类目-商品)。
语法格式:
SELECT 维度字段, 聚合函数(指标)
FROM 表名
GROUP BY ROLLUP(维度1,维度2,维度3);
3.3 CUBE:全维度交叉聚合(全覆盖汇总)
核心定义:计算所有可能的维度组合,实现全量交叉聚合,不区分维度层级,覆盖所有统计粒度。
聚合规则:维度(a,b,c) CUBE 会生成 $$2^n$$ 种组合(n为维度数),包含所有单维度、多维度、全量汇总结果。
适用场景:无固定层级、需要全维度交叉分析的场景,多用于多维数据探索、全局报表统计。
语法格式:
SELECT 维度字段, 聚合函数(指标)
FROM 表名
GROUP BY CUBE(维度1,维度2,维度3);
3.4 三大语法核心差异对比
|
语法 |
聚合特点 |
维度组合规则 |
性能 |
适用场景 |
|---|---|---|---|---|
|
GROUPING SETS |
自定义聚合 |
仅用户指定组合 |
最优(无无效计算) |
定制化固定维度报表 |
|
ROLLUP |
层级上卷聚合 |
按维度顺序逐层汇总 |
中等 |
层级维度统计(时间、地区、品类) |
|
CUBE |
全交叉聚合 |
所有维度自由组合 |
最差(计算量最大) |
全维度数据探索、全局分析 |
四、实战演练:电商销售多维统计
下面基于电商销售场景,搭建测试表、导入测试数据,完整演示三大语法的实战用法,所有SQL基于 Doris 4.x 版本,可直接复制执行。
4.1 构建测试数据表
创建电商销售明细表,维度包含:统计日期、省份、商品品类,指标包含:销售额、订单量。
-- 创建电商销售明细表(Doris聚合模型)
CREATE TABLE IF NOT EXISTS ecommerce_sales (
sale_date DATE COMMENT '销售日期',
province VARCHAR(20) COMMENT '销售省份',
category VARCHAR(20) COMMENT '商品品类',
sales_amount DECIMAL(10,2) SUM COMMENT '销售额',
order_cnt INT SUM COMMENT '订单量'
)
AGGREGATE KEY(sale_date, province, category)
DISTRIBUTED BY HASH(sale_date) BUCKETS 4
PROPERTIES (
"replication_allocation" = "tag.location.default: 1",
"enable_vectorized_engine" = "true"
);
4.2 导入测试数据
INSERT INTO ecommerce_sales VALUES
('2026-07-01','广东省','数码',9990.00,100),
('2026-07-01','广东省','服饰',5990.00,180),
('2026-07-01','浙江省','数码',8880.00,85),
('2026-07-01','浙江省','服饰',4500.00,120),
('2026-07-02','广东省','数码',12000.00,125),
('2026-07-02','广东省','服饰',6800.00,210),
('2026-07-02','浙江省','数码',9500.00,92),
('2026-07-02','浙江省','服饰',5200.00,145);
4.3 GROUPING SETS 实战(定制维度聚合)
业务需求:分别统计每日总销售额、各省份总销售额、各品类总销售额,无需全量组合数据。
SELECT
sale_date,
province,
category,
SUM(sales_amount) AS total_sales,
SUM(order_cnt) AS total_order
FROM ecommerce_sales
GROUP BY GROUPING SETS (
(sale_date), -- 按日期汇总
(province), -- 按省份汇总
(category) -- 按品类汇总
)
ORDER BY total_sales DESC;
结果说明:仅输出三种指定维度的聚合结果,无冗余数据,计算效率最高。
4.4 ROLLUP 实战(层级维度上卷)
业务需求:按日期-省份-品类层级,逐层汇总销售额,实现明细→日期省份→日期→全量的层级统计。
SELECT
sale_date,
province,
category,
SUM(sales_amount) AS total_sales,
SUM(order_cnt) AS total_order
FROM ecommerce_sales
GROUP BY ROLLUP(sale_date, province, category)
ORDER BY sale_date, province, category;
聚合层级拆解:
-
最细粒度:日期+省份+品类 明细汇总;
-
二级汇总:日期+省份 汇总(忽略品类);
-
一级汇总:日期 全局汇总(忽略省份、品类);
-
最高层级:全量数据总汇总。
4.5 CUBE 实战(全维度交叉聚合)
业务需求:探索所有维度组合的销售数据,覆盖所有单维度、双维度、三维度、全量汇总,用于全局数据洞察。
SELECT
sale_date,
province,
category,
SUM(sales_amount) AS total_sales,
SUM(order_cnt) AS total_order
FROM ecommerce_sales
GROUP BY CUBE(sale_date, province, category)
ORDER BY total_sales DESC;
结果说明:生成8种维度组合结果,覆盖所有统计可能,适合无固定统计规则的数据分析探索场景。
4.6 辅助函数:GROUPING 区分聚合层级
多维聚合结果中,NULL 可能是原始数据空值,也可能是聚合上卷的汇总空值,可通过 GROUPING() 函数区分:
-
返回 1:该字段为聚合汇总维度(NULL为汇总生成);
-
返回 0:该字段为原始明细维度(NULL为原始数据空值)。
优化后查询SQL:
SELECT
sale_date,
province,
category,
GROUPING(sale_date) AS is_date_group,
GROUPING(province) AS is_province_group,
SUM(sales_amount) AS total_sales
FROM ecommerce_sales
GROUP BY ROLLUP(sale_date, province, category);
五、Doris多维分析性能优化方案
多维聚合本身存在多粒度计算开销,数据量越大性能差异越明显,结合Doris架构特性,整理4个核心优化方案,适配亿级以上数据场景。
5.1 优先使用GROUPING SETS
业务固定报表场景,优先选择 GROUPING SETS 替代 CUBE、ROLLUP,仅计算所需维度组合,避免无效聚合计算,可提升30%-50%查询性能。
5.2 构建ROLLUP预聚合物化视图
针对高频多维统计场景,基于基础表创建 ROLLUP 物化视图,提前预聚合多粒度数据,查询时直接命中预计算结果,实现毫秒级响应。
示例:创建日期+省份预聚合视图
CREATE MATERIALIZED VIEW sales_date_province_rollup
AS SELECT sale_date, province, SUM(sales_amount), SUM(order_cnt)
FROM ecommerce_sales
GROUP BY sale_date, province;
5.3 合理设置维度排序与分桶
建表时将高频分组维度作为分桶键、排序键,让相同维度数据物理聚集存储,减少查询时的数据扫描与shuffle开销,大幅提升聚合效率。
5.4 开启向量化执行引擎
Doris 4.x 默认开启向量化引擎,按列批量处理数据,相比行式执行,多维聚合计算性能提升2-5倍,确保配置参数开启:enable_vectorized_engine = true。
六、业务场景总结
结合三大语法特性,精准匹配企业主流多维分析场景:
-
固定报表统计(日报/月报/业务看板):使用 GROUPING SETS,高效精准、无冗余计算;
-
层级数据分析(时间、地区、品类层级汇总):使用 ROLLUP,实现明细到总览的层级穿透分析;
-
数据探索分析(多维交叉洞察、临时统计分析):使用 CUBE,全覆盖维度组合,满足灵活分析需求;
-
实时多维大屏:结合ROLLUP物化视图+实时写入,实现数据实时更新、秒级查询响应。
七、常见问题FAQ
Q1:多维聚合和多次UNION ALL有什么本质区别?
UNION ALL 会多次扫描底层表、多次计算,IO与CPU开销极高;Doris多维语法单次扫描、批量计算、一次返回,数据量越大性能优势越明显。
Q2:CUBE性能太差,大数据量如何优化?
CUBE计算量随维度数指数增长,大数据量下不建议使用,可拆解为 GROUPING SETS 指定所需维度组合,或通过物化视图预聚合优化。
Q3:多维聚合结果的NULL如何处理?
通过 GROUPING() 函数区分聚合NULL与原始NULL,业务中可结合 CASE WHEN 语句将汇总行NULL替换为“总计”“全部”等业务标识。
八、总结
Apache Doris 原生多维分析能力,彻底革新了传统大数据多维统计的实现方式,以极简SQL、高性能、低维护的特性,完美适配企业实时数仓、数据报表、可视化大屏、多维数据探索等核心场景。
掌握 ROLLUP、CUBE、GROUPING SETS 三大语法的差异与适用场景,结合物化视图、向量化引擎优化,可轻松实现亿级数据秒级多维聚合,是大数据开发、数仓建设的必备核心技能。
更多推荐




所有评论(0)