一、前言:为什么需要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优化方案。

其底层执行逻辑:

  1. FE 解析多维聚合SQL,拆解所有需要计算的维度组合;

  2. 生成统一的分布式执行计划,下发至所有 BE 节点;

  3. BE 节点并行扫描列式存储数据,批量完成多维度聚合计算;

  4. 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;

聚合层级拆解

  1. 最细粒度:日期+省份+品类 明细汇总;

  2. 二级汇总:日期+省份 汇总(忽略品类);

  3. 一级汇总:日期 全局汇总(忽略省份、品类);

  4. 最高层级:全量数据总汇总。

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 三大语法的差异与适用场景,结合物化视图、向量化引擎优化,可轻松实现亿级数据秒级多维聚合,是大数据开发、数仓建设的必备核心技能。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐