Doris : ROLLUP 与 物化视图

本文探讨了Doris数据库中的ROLLUP特性,如何通过创建物化索引加速查询,并与物化视图功能进行比较。重点讲解了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].<materialized_view_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存储引擎中无法使用物化视图,需要现场聚合。
Apache Doris 提供了物化视图功能,这是一种预计算并存储查询结果的机制,旨在提升复杂查询的执行效率。传统的 Rollup 相比,物化视图支持对任意数据模型(包括明细模型)进行预聚合操作,适用范围更广,可以视为 Rollup 的升级版[^1]。 ### 功能介绍 - **自动维护**:Doris 自动维护物化视图的数据一致性,无论是新的导入还是删除操作,都能保证 Base 表物化视图表的数据一致性,无需任何额外的人工维护成本。 - **广泛的支持性**:物化视图定义语句只允许 SELECT、FROM、WHERE、JOIN GROUP BY 子句,支持 INNER LEFT OUTER JOIN 操作类型。虽然目前不支持窗口函数、LIMIT 以及基于外部表的物化视图不能保证查询结果的强一致性,但这些限制将随着版本更新逐步得到解决。 - **性能优化**:对于那些经常重复使用的相同子查询结果,物化视图能够大幅提升查询性能。查询时,系统会自动匹配到最优物化视图,并直接从物化视图中读取数据。 - **适用场景**:物化视图适用于分析需求覆盖明细数据查询以及固定维度查询的情况,尤其是当查询仅涉及表中的很小一部分列或行,或者查询包含一些耗时处理操作(如长时间的聚合操作)时效果显著。此外,它还能提供一种 key,提高前缀索引的命中率[^2]。 ### 使用方法 1. **创建物化视图**: 创建物化视图的基本语法如下: ```sql CREATE MATERIALIZED VIEW mv_name AS SELECT column1, column2, ..., aggregate_function(column) FROM table_name WHERE condition GROUP BY column1, column2, ...; ``` 其中 `mv_name` 是物化视图的名字,`table_name` 是基础表的名字,`column1, column2, ...` 是参聚合的列,`aggregate_function(column)` 是聚合函数的应用。 2. **注意事项**: - 物化视图定义不能利用视图或其他物化视图。 - 当前不支持使用非确定性函数来构建物化视图,例如 `rand`, `now`, `current_time`, `current_date`, `random`, `uuid` 等。 - 查询物化视图中存在 LIMIT,并且暂时不支持透明重写。 - 范围条件补偿目前还不支持,但将在未来版本中逐渐增加[^3]。 3. **查询优化**: - 在查询过程中,Doris 会自动选择最合适的物化视图来加速查询,用户不需要手动指定。 - 物化视图的查询优化主要依赖于其定义的 SQL 语句,因此在创建时需要仔细考虑查询模式,以确保最佳的性能提升。 通过合理地设计使用物化视图,可以显著提高 Apache Doris 中复杂查询的响应速度,特别是在处理大规模数据集时,这一优势尤为明显。同时,由于 Doris 自动管理物化视图的数据一致性,减少了运维负担,使得开发者可以更加专注于业务逻辑的实现[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值