在 Doris中,通过建表语句创建出来的表成为 Base 表。Base 表中保存按建表语句指定的方式存储的基础数据。
在 Base 表之上,我们可以创建任意多个 ROLLUP 表。这些 ROLLUP 的数据是基于 Base 表产生的,并且在物理上是独立存储的。
(1)ROLLUP 本质上是Base 表的一个物化索引。建立 Rollup 时可只选取 Base 表 中的部分列作为 Schema。减少key列以增加数据的聚合度。
(2)Doris 会把 Base/Rollup 表中的前 36 个字节。在底层存储引擎单独生成一份排序的稀疏索引数据,然后在查询的时候会根据查询中的条件来匹配每个 Base/Rollup 的前缀索引。
而使用ROLLUP 可以调整列的顺序以增加前缀索引的命中率。
(3)创建的 ROLLUP 越多,占用的磁盘空间也就越大。同时对导入速度也会有影响,但是不会降低查询效率
Base 表
CREATE TABLE `events` ( `id` bigint, `user_id` bigint DEFAULT NULL , `group_type` int DEFAULT NULL, `group_id` int DEFAULT NULL, `event_type` varchar(45) DEFAULT NULL, `event_name` varchar(45) DEFAULT NULL, `event_count` int DEFAULT NULL, `event_time` bigint DEFAULT NULL, `created_time` bigint DEFAULT NULL, `updated_time` bigint DEFAULT NULL ) DUPLICATE KEY(id) DISTRIBUTED BY HASH(id) BUCKETS 1 PROPERTIES ( "replication_num" = "3" );
执行计划
EXPLAIN select id from `events`
0:OlapScanNode TABLE: events PREAGGREGATION: ON partitions=1/1 rollup: events ----- 主要看这里 tabletRatio=6/6 tabletList=10015,10019,10023,10027,10031,10035 cardinality=8310077 avgRowSize=15.075936 numNodes=3
创建ROLLUP
我们可以通过创建不同的rollup,来指定不同的排序列的顺序,以适应不同的查询方式。
alter table events add rollup rollup_event(event_name,event_count);
执行计划
EXPLAIN select event_name,event_count from `events`
0:OlapScanNode TABLE: mars_micro_user_events PREAGGREGATION: ON partitions=1/1 rollup: rollup_event tabletRatio=6/6 tabletList=10041,10045,10049,10053,10057,10061 cardinality=5540888 avgRowSize=0.09949795 numNodes=3
ROLLUP是物化视图的一个子集, 在没有物化视图功能之前,用户一般都是使用 Rollup 功能通过预聚合方式提升查询效率。物化视图则在覆盖了 Rollup 的功能的同时,还能支持更丰富的聚合函数。
所有你懂得:了解更多,看下面物化视图。
视图是一个虚拟表,基于它创建时指定的查询语句返回的结果集。每次访问它都会导致这个查询语句被执行一次。为了避免每次访问都执行这个查询,可以将这个查询结果集存储到一个物化视图。
物化视图与普通的视图相比不同的是:物化视图是建立的副本,它类似于一张表,需要占用存储空间。而对一个物化视图查询的执行效率与查询一个表是一样的。
归纳: 物化视图是提取特定维度以创建对用户透明但具有真实数据的视图表的组合。
Doris的物化视图确保在更新时直接更新原始表,Doris将确保原始表和物化视图自动生效。查询时,用户只需要指定原始表,Doris将根据查询的具体条件选择适当的物化视图来完成查询。既能对原始明细数据的任意纬度分析,也能快速的对固定纬度进行分析查询。总结几点就是以下:
(1)分析需求覆盖明细数据查询和固定维度查询。
(2)查询仅涉及表中字段不多,很小一部分列或行。
(3)查询包含一些耗时处理操作,比如:时间范围很广的聚合操作等。
(4)查询需要匹配不同前缀索引。
创建物化视图
create materialized view materialized_view_name as select cloumn, sum(value_cloumn) from db_name.table_name group by cloumn
删除物化视图
DROP MATERIALIZED VIEW [IF EXISTS] [db_name].
查询命令
(1) 查看该database下的所有物化视图
show materialized view [in|from db_name]
(2) 查看指定物化视图的表结构
desc table_name all
(3)查看物化视图处理进度
show alter materialized view from db_name
(4)取消正在创建的物化视图
cancel alter materialized view from db_name.table_name
(5)执行计划
explain sql
使用
CREATE MATERIALIZED VIEW materialized_view_event AS SELECT id, SUM(event_count) AS sum_event FROM events GROUP BY id ORDER BY id
执行计划
EXPLAIN SELECT id, SUM(event_count) AS sum_event FROM mars_micro_user_events GROUP BY id ORDER BY id
0:OlapScanNode TABLE: mars_micro_user_events PREAGGREGATION: ON partitions=1/1 rollup: materialized_view_event tabletRatio=6/6 tabletList=10067,10071,10075,10079,10083,10087 cardinality=0 avgRowSize=12.0 numNodes=1 注意 rollup :字段表示到底命中了哪个物化视图。 PREAGGREGATION: 字段如果是ON,就表明查询时不需要在DorisDB存储引擎中现场聚合,查询会更快。 如果是OFF,后面会显示原因:例 The aggregate operator does not match 表示因为查询的聚合函数和物化视图中定义的聚合函数不一致, 所以在DorisDB存储引擎中无法使用物化视图,需要现场聚合。