Doris–基础–5.1–Rollup
1、介绍
- ROLLUP 在多维分析中是"上卷"的意思,即将数据按某种指定的粒度进行进一步聚合。
- Rollup 可以理解为 Table 的一个物化索引结构。
- 物化是指:其数据在物理上独立存储,
- 索引是指:Rollup可以调整列顺序以增加前缀索引的命中率,也可以减少key列以增加数据的聚合度。
1.1、概念
- 在Doris中,我们将用户通过建表语句创建出来的表成为 Base表(Base Table),Base表中 保存着按用户建表语句指定的方式存储的基础数据。
- 在Base表 之上,我们可以创建任意多个 ROLLUP表。这些 ROLLUP 的数据是基于 Base 表产生的,并且在物理上是独立存储的。
1.2、作用
- 在于在 Base 表的基础上,获得更粗粒度的聚合数据。
- 在聚合表的基础上,按照其他维度再进一步聚合,提升查询效率。
- Doris索引是固定的前缀索引,用rollup改变索引顺序
- 提高某些查询的查询效率(无论是通过聚合来减少数据量,还是修改列顺序以匹配前缀索引)。
1.3、触发ROLLUP
- ROLLUP 创建完成之后的触发是程序自动的,不需要任何其他指定或者配置。
- 查询能否命中 ROLLUP 的一个必要条件(非充分条件)是,查询所涉及的所有列(包括 select list 和 where 中的查询条件列等)都存在于该 ROLLUP 的列中。否则,查询只能命中 Base 表。
1.4、注意
- ROLLUP 的数据更新与 Base 表示完全同步的。用户无需关心这个问题。
- ROLLUP 中列的聚合方式,与 Base 表完全相同。
- 在创建 ROLLUP 无需指定,也不能修改。
- Schema 中的字段顺序 可与 Base Table 不同。
2、测试数据
CREATE TABLE IF NOT EXISTS test_db.site_visit
(
`user_id` LARGEINT NOT NULL COMMENT "用户id",
`date` DATE NOT NULL COMMENT "数据灌入日期时间",
`city` VARCHAR(20) COMMENT "用户所在城市",
`age` SMALLINT COMMENT "用户年龄",
`sex` TINYINT COMMENT "用户性别",
`last_visit_date` DATETIME REPLACE DEFAULT "1970-01-01 00:00:00" COMMENT "用户最后一次访问时间",
`cost` BIGINT SUM DEFAULT "0" COMMENT "用户总消费",
`max_dwell_time` INT MAX DEFAULT "0" COMMENT "用户最大停留时间",
`min_dwell_time` INT MIN DEFAULT "99999" COMMENT "用户最小停留时间"
)
AGGREGATE KEY(`user_id`, `date`, `city`, `age`, `sex`)
DISTRIBUTED BY HASH(`user_id`) BUCKETS 10;
insert into test_db.site_visit values(10000,'2017-10-01','北京',20,0,'2017-10-01 06:00:00',20,10,10);
insert into test_db.site_visit values(10001,'2017-10-01','北京',30,1,'2017-10-01 17:05:45',2,22,22);
insert into test_db.site_visit values(10002,'2017-10-02','上海',20,1,'2017-10-02 12:59:12',200,5,5);
insert into test_db.site_visit values(10003,'2017-10-02','广州',32,0,'2017-10-02 11:20:00',30,11,11);
insert into test_db.site_visit values(10004,'2017-10-01','深圳',35,0,'2017-10-01 10:00:15',100,3,3);
3、举例
3.1、场景
比如需要查看某个城市的user_id数,那么可以建立一个只有user_id和city的rollup
3.2、创建rollup
alter table site_visit add rollup rollup_city_userid(city,user_id);
3.3、通过命令查看完成状态
SHOW ALTER TABLE ROLLUP;
3.4、查看完成情况
DESC site_visit ALL;
3.5、可以使用以下命令取消当前正在执行的作业(只有未完成状态的才能取消)
CANCEL ALTER TABLE ROLLUP FROM site_visit;
SHOW ALTER TABLE ROLLUP;
3.6、查询(执行的时候,BE就挂了)
Rollup 建立之后,查询不需要指定 Rollup 进行查询。还是指定原有表进行查询即可。程序会自动判断是否应该使用 Rollup。是否命中 Rollup可以通过 EXPLAIN your_sql; 命令进行查看。
3.6.1、查询数据
select select date from site_visit where city='北京';
3.6.2、查看执行计划是否命中Rollup
explain select date from site_visit where city='北京';