Doris : ROLLUP 与 物化视图

ROLLUP

在 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将确保原始表和物化视图自动生效。查询时,用户只需要指定原始表,Doris将根据查询的具体条件选择适当的物化视图来完成查询。既能对原始明细数据的任意纬度分析,也能快速的对固定纬度进行分析查询。总结几点就是以下:

  1. 对于那些经常重复的使用相同的子查询结果的查询性能大幅提升。
  2. Doris自动更新物化视图的数据,保证原始表和物化视图表的数据一致性。无需额外的维护成本。
  3. 查询的时候也可以自动匹配最优的物化视图。
  4. 物化视图必须是对单个表的聚合,如:count,max,min,sum,percentile_approx,hll_union等。
  5. 执行Delete 操作时,如果 Where 条件中的某个 Key 列在某个 RollUp表中不存在,则不允许删除。

使用场景

(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存储引擎中无法使用物化视图,需要现场聚合。

你可能感兴趣的:(sql,数据库,大数据)