当前位置: 首页 > news >正文

Doris专题5- Rollup与查询

1. Rollup基本概念

1.1 核心定义

  • Base Table:用户通过建表语句创建的基础表
  • ROLLUP表:基于Base表创建的辅助数据结构,物理上独立存储
  • 作用:获得更粗粒度的聚合数据或调整列顺序优化查询

1.2 Rollup类型

Base Table
Aggregate模型Rollup
Unique模型Rollup
Duplicate模型Rollup
数据聚合
数据聚合
前缀索引优化

2. Aggregate模型中的Rollup

2.1 基础表示例

Base表结构:

ColumnNameTypeAggregationTypeComment
user_idLARGEINT-用户id
dateDATE-数据灌入日期
timestampDATETIME-数据灌入时间
cityVARCHAR(20)-用户所在城市
ageSMALLINT-用户年龄
sexTINYINT-用户性别
last_visit_dateDATETIMEREPLACE最后访问时间
costBIGINTSUM用户总消费
max_dwell_timeINTMAX最大停留时间
min_dwell_timeINTMIN最小停留时间

2.2 Rollup示例1:用户总消费

-- 创建用户消费汇总Rollup
ALTER TABLE table_name ADD ROLLUP rollup_user_cost(user_id, cost);

Rollup数据效果:

user_idcost
1000035
100012
10002200
1000330
10004111

查询自动命中:

SELECT user_id, sum(cost) FROM table GROUP BY user_id;

2.3 Rollup示例2:城市年龄维度聚合

-- 创建城市年龄维度Rollup
ALTER TABLE table_name ADD ROLLUP rollup_city_age(city, age, cost, max_dwell_time, min_dwell_time
);

Rollup数据效果:

cityagecostmax_dwell_timemin_dwell_time
北京2035102
北京3022222
上海2020055
广州32301111
深圳3511163

可命中的查询:

-- 查询1:城市+年龄维度聚合
SELECT city, age, sum(cost), max(max_dwell_time), min(min_dwell_time) 
FROM table GROUP BY city, age;-- 查询2:城市维度聚合  
SELECT city, sum(cost), max(max_dwell_time), min(min_dwell_time)
FROM table GROUP BY city;-- 查询3:城市+年龄维度部分聚合
SELECT city, age, sum(cost), min(min_dwell_time)
FROM table GROUP BY city, age;

3. Duplicate模型中的Rollup

3.1 前缀索引优化

Base表结构:

ColumnNameType
user_idBIGINT
ageINT
messageVARCHAR(100)
max_dwell_timeDATETIME
min_dwell_timeDATETIME

创建调整列顺序的Rollup:

ALTER TABLE table_name ADD ROLLUP rollup_age_first(age, user_id, message, max_dwell_time, min_dwell_time
);

查询优化效果:

-- 该查询会优先选择rollup_age_first
SELECT * FROM table WHERE age=20 AND message LIKE "%error%";

4. Rollup使用说明

4.1 核心特性

  • 自动命中:查询时自动选择最优Rollup,无需显式指定
  • 独立存储:物理上独立存储,占用额外磁盘空间
  • 数据同步:与Base表数据完全同步,无需手动维护
  • 聚合方式:继承Base表的聚合方式,不可修改

4.2 命中条件

  • 必要条件:查询涉及的所有列都必须存在于Rollup中
  • 聚合命中:仅Aggregate/Unique模型支持聚合数据命中
  • 索引命中:所有模型都支持前缀索引命中

4.3 限制说明

  • count(*)查询无法命中任何Rollup
  • 创建Rollup会影响导入性能(ETL阶段生成Rollup数据)
  • Rollup越多,磁盘空间占用越大

5. 前缀索引机制

5.1 索引原理

  • 索引长度:前36个字节(varchar类型最多使用20个字节)
  • 存储方式:排序的稀疏索引 + 排序的数据
  • 匹配规则:从左到右匹配查询条件中的列

5.2 索引匹配示例

匹配第一列
匹配失败
查询条件
前缀索引匹配
继续匹配下一列
停止匹配
累计匹配长度
是否达到36字节
选择匹配最长的Rollup

5.3 复杂示例分析

Base表和Rollup结构:

-- Base表
CREATE TABLE test (k1 TINYINT,k2 SMALLINT, k3 INT,k4 BIGINT,k5 DECIMAL(9,3),k6 CHAR(5),k7 DATE,k8 DATETIME,k9 VARCHAR(20),k10 DOUBLE MAX,k11 FLOAT SUM
);-- 多个Rollup
ALTER TABLE test ADD ROLLUP rollup_index1(k9, k1, k2, k3, k4, k5, k6, k7, k8, k10, k11);
ALTER TABLE test ADD ROLLUP rollup_index2(k9, k2, k1, k3, k4, k5, k6, k7, k8, k10, k11);
ALTER TABLE test ADD ROLLUP rollup_index3(k4, k5, k6, k1, k2, k3, k7, k8, k9, k10, k11);
ALTER TABLE test ADD ROLLUP rollup_index4(k4, k6, k5, k1, k2, k3, k7, k8, k9, k10, k11);

前缀索引分布:

  • Base: (k1, k2, k3, k4, k5, k6, k7)
  • rollup_index1: (k9)
  • rollup_index2: (k9)
  • rollup_index3: (k4, k5, k6, k1, k2, k3, k7)
  • rollup_index4: (k4, k6, k5, k1, k2, k3, k7)

5.4 查询命中分析

示例1:基础条件查询

SELECT * FROM test WHERE k1 = 1 AND k2 > 3;

命中分析:Base表,匹配前缀索引(k1, k2)

示例2:Rollup条件查询

SELECT * FROM test WHERE k4 = 1 AND k5 > 3;

命中分析:rollup_index3,匹配前缀索引(k4, k5)

示例3:Varchar列查询

SELECT * FROM test WHERE k9 IN ("xxx", "yyyy") AND k1 = 10;

命中分析:rollup_index1,匹配前缀索引(k9, k1)

示例4:多Rollup可选

SELECT * FROM test WHERE k4 < 1000 AND k5 = 80 AND k6 >= 10000;

命中分析:rollup_index3或rollup_index4,选择较早创建的

6. 聚合数据命中规则

6.1 命中前提条件

  1. 查询涉及的所有列都存在于Rollup中
  2. 如果查询包含Join,必须是Inner Join类型

6.2 聚合函数支持情况

列类型SUMCount DistinctMinMaxApprox Count Distinct
Key列falsetruetruetruetrue
Value(Sum)truefalsefalsefalsefalse
Value(Replace)falsefalsefalsefalsefalse
Value(Min)falsefalsetruefalsefalse
Value(Max)falsefalsefalsetruefalse

6.3 聚合Rollup选择策略

聚合查询
是否满足命中条件
使用Base表
匹配前缀索引最长的Rollup
选择行数最少的Rollup
执行查询

6.4 聚合命中示例

表结构:

-- Base表
CREATE TABLE test_rollup (k1 TINYINT, k2 SMALLINT, k3 INT, k4 BIGINT, k5 DECIMAL(9,3),k6 CHAR(5), k7 DATE, k8 DATETIME, k9 VARCHAR(20),k10 DOUBLE MAX, k11 FLOAT SUM
);-- Rollup表
ALTER TABLE test_rollup ADD ROLLUP rollup1(k1, k2, k3, k4, k5, k10, k11);
ALTER TABLE test_rollup ADD ROLLUP rollup2(k1, k2, k3, k10, k11);

查询分析:

SELECT SUM(k11) FROM test_rollup 
WHERE k1 = 10 AND k2 > 200 AND k3 in (1,2,3);

命中过程:

  1. 检查可命中Rollup:rollup1、rollup2都满足
  2. 前缀索引匹配:两者都匹配(k1, k2, k3),长度相同
  3. 选择行数最少:rollup2聚合程度更高,选择rollup2

7. 管理和诊断工具

7.1 查看Rollup信息

-- 查看所有Rollup
DESC table_name ALL;-- 查看建表语句(包含Rollup)
SHOW CREATE TABLE table_name;

7.2 执行计划分析

-- 查看查询执行计划
EXPLAIN your_sql;-- 分析Rollup命中情况
EXPLAIN SELECT city, sum(cost) FROM table GROUP BY city;

执行计划关键字段:

  • rollup: 显示命中的Rollup名称
  • PREAGGREGATION: 显示预聚合状态
  • PREDICATES: 显示应用的查询条件

7.3 Rollup管理命令

-- 创建Rollup
ALTER TABLE table_name ADD ROLLUP rollup_name(column_list);-- 删除Rollup  
ALTER TABLE table_name DROP ROLLUP rollup_name;-- 查看Rollup创建进度
SHOW ALTER TABLE ROLLUP;

8. 最佳实践

8.1 Rollup设计原则

  • 高频查询优先:为最频繁的查询模式创建Rollup
  • 数据聚合度:选择聚合程度高的列组合
  • 存储成本:平衡查询性能与存储开销
  • 列顺序优化:将过滤条件频繁的列放在前面

8.2 常见场景建议

8.2.1 报表分析场景
-- 为日报表创建Rollup
ALTER TABLE sales ADD ROLLUP rpt_daily(event_date, product_category, region, total_sales SUM, total_orders SUM
);-- 为月报表创建Rollup  
ALTER TABLE sales ADD ROLLUP rpt_monthly(date_trunc('month', event_date), product_category,total_sales SUM, total_orders SUM
);
8.2.2 用户行为分析
-- 用户维度聚合
ALTER TABLE user_behavior ADD ROLLUP rollup_user(user_id, last_visit_date REPLACE, total_clicks SUM, max_duration MAX
);-- 页面维度聚合
ALTER TABLE user_behavior ADD ROLLUP rollup_page(page_id, total_views SUM, avg_duration AVG, bounce_rate MIN
);

8.3 性能监控

-- 监控Rollup使用情况
SHOW PROC "/dbs/db_id/table_id/indices";-- 分析查询模式
EXPLAIN ANALYZE your_sql;-- 监控存储开销
SHOW DATA;

9. 注意事项

9.1 设计注意事项

  • 避免创建过多Rollup影响导入性能
  • 定期评估Rollup的使用效果
  • 考虑数据更新频率对Rollup维护的影响

9.2 使用限制

  • 无法显式指定查询某个Rollup
  • 某些查询类型无法命中Rollup(如count(*))
  • Rollup一旦创建,修改需要重建

9.3 故障排查

  • 使用EXPLAIN检查Rollup命中情况
  • 监控Rollup构建进度和状态
  • 关注存储空间使用情况
http://www.dtcms.com/a/446211.html

相关文章:

  • 爬虫与自动化技术深度解析:从数据采集到智能运维的完整实战指南——千亿级商品比价系统架构与自动化运维
  • XMLHttpRequest 发送json 格式的数据,servlet 接收
  • PCIe协议之复位篇之Fundamental Reset (Cold or Warm Reset) 和 HotReset(一)
  • 数据结构与算法:合集1.0版
  • Redis 常见面试题
  • PostgreSQL透明加密(TDE)技术深度解析:从实现原理到国密合规实践
  • 86-dify案例分享-Qwen3-VL+Dify:从作业 OCR 到视频字幕,多模态识别工作流一步教,附体验链接
  • [ClaudeCode指北] Windows 本地 MCP 服务器配置与管理指南
  • 【LeetCode热题100(34/100)】合并 K 个升序链表
  • 怎么建设网站数据库广告营销策略分析
  • 英文网站营销邢台论坛网
  • 【第十六周】自然语言处理的学习笔记01
  • 企业logo设计报价wordpress终极优化
  • 进程与线程的区别和适用场景
  • 泉州微信网站开发公司微信官网手机版
  • LVGL 开发指南:从入门到精通的嵌入式 GUI 实战心法
  • Spring——事务的传播性
  • 【优化】Mysql指定索引查询或忽略某个索引
  • 网站伪静态steam交易链接可以随便给别人吗
  • 日语学习-日语知识点小记-进阶-JLPT-N1阶段应用练习(5):语法 +考え方18+2022年7月N1
  • Postman-win64-8.6.2-Setup安装教程(附详细步骤,Win64版Postman下载安装指南)
  • 关于软错误的常见问题解答
  • LLM 只会生成文本?用 ReAct 模式手搓一个简易 Claude Code Agent
  • 如果给公司做网站深圳网站建设费用大概
  • 【开题答辩全过程】以 Python在浙江省人口流动数据分析与城市规划建议的应用为例,包含答辩的问题和答案
  • InputReader与InputDispatcher关系 - android-15.0.0_r23
  • 基于Android Framework的C/C++开发实战
  • 个人主页网站制作教程营销策划的六个步骤
  • 第7章树和二叉树:二叉树的定义和性质
  • 网站建设首选玖艺建站信得过wordpress企业主题下载