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].<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存储引擎中无法使用物化视图,需要现场聚合。
<think>好的,用户问的是如何在Apache Doris中为物化视图创建或添加索引。首先,我需要回忆一下Doris的文档相关资料。记得Doris物化视图主要是通过预计算来加速查询,而索引方面,Doris使用智能的预聚合前缀索引来优化查询性能,而不是传统意义上的手动创建索引。 然后,用户可能对物化视图的索引机制不太清楚,需要解释Doris的索引策略。比如,前缀索引是自动根据表的排序键生成的,而物化视图的排序键也是由创建时的SELECT语句决定的。因此,用户可能需要调整物化视图的排序键来优化索引效果。 接下来,考虑用户的需求是否可以通过其他方式实现,比如调整物化视图的构建列顺序,或者利用Rollup来增加不同的预聚合路径。可能还需要提到Doris的自动索引管理,不需要手动维护,这样用户就不必像在传统数据库中那样手动创建索引。 还要检查是否有相关的引用内容。用户提供的引用中提到Doris的查询速度是亚秒级,支持高并发,这可能物化视图及索引的设计有关。需要确保回答中提到的优化方法这些引用一致,比如利用排序键Rollup来提高查询效率。 最后,生成相关问题时要围绕物化视图的优化、索引机制以及其他技术的比较,帮助用户深入理解。确保回答结构清晰,分步骤说明操作,并提醒注意事项,比如索引自动创建无法手动添加的情况。</think>### 如何在 Apache Doris 中为物化视图创建或添加索引? 在 Apache Doris 中,物化视图(Materialized View)的索引机制普通表有所不同,其优化主要依赖于 Doris 的智能预聚合前缀索引设计。以下是具体操作原理说明: --- #### 1. **物化视图的索引机制** Doris物化视图通过**前缀索引****预聚合**来加速查询,而非传统数据库的手动创建索引。其核心逻辑如下: - **前缀索引**:Doris 会根据物化视图的 `ORDER BY` 列自动生成前缀索引。例如,若物化视图的排序键为 `(dt, user_id)`,查询条件包含 `dt` 或 `(dt, user_id)` 时,可直接利用前缀索引快速定位数据[^1]。 - **预聚合**:物化视图通过聚合操作(如 `SUM`、`COUNT`)提前计算结果,查询时直接读取聚合数据,无需全表扫描。 --- #### 2. **为物化视图优化索引的步骤** 虽然不能直接为物化视图添加索引,但可以通过以下方式优化查询性能: 1. **合理设计排序键** 在创建物化视图时,通过 `ORDER BY` 指定高频查询条件的列顺序。例如: ```sql CREATE MATERIALIZED VIEW mv_orders DISTRIBUTED BY HASH(order_id) ORDER BY (dt, product_id) AS SELECT dt, product_id, SUM(amount) FROM orders GROUP BY dt, product_id; ``` 此设计会为 `(dt, product_id)` 生成前缀索引,加速包含这些列的查询。 2. **利用 Rollup 增强查询路径** RollupDoris 中一种特殊的物化视图,可通过添加不同维度的 Rollup 为查询提供更多索引路径: ```sql ALTER TABLE orders ADD ROLLUP rollup_product (product_id, dt, SUM(amount)); ``` 当查询条件包含 `product_id` 时,优先命中 Rollup 的排序键。 3. **数据分区分桶** 结合 `PARTITION BY` `DISTRIBUTED BY` 对数据进行物理划分,减少扫描范围: ```sql CREATE MATERIALIZED VIEW mv_log PARTITION BY dt DISTRIBUTED BY HASH(user_id) ORDER BY (dt, user_id) AS SELECT dt, user_id, COUNT(*) AS pv FROM log GROUP BY dt, user_id; ``` --- #### 3. **注意事项** - Doris **不会为物化视图单独创建二级索引**,所有优化均基于排序键预聚合。 - 若查询性能未达预期,可通过 `EXPLAIN` 分析查询是否命中物化视图Rollup[^2]。 - 调整物化视图的 `ORDER BY` 列后,需重新构建视图(通过 `REFRESH MATERIALIZED VIEW` 或重新创建)。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值