在Doris中,我们会经常使用到Rollup,用来做查询优化。那什么是Rollup呢?
Rollup其实在doris的基础表上层架构的一层物理表,他的主要功能有:提取基础表的某一部分数据、通过改变字段顺序提升查询速度等等。Doris中的Rollup表是真实存在的,是一份单独的物理存储,他里面的数据不需要我们手动的去操作。他相当于在基础表的基础上添加了一个触发器,当我们存储基础数据表的时候,这个触发器就会被触发,同时数据会被再存储一份到Rollip表里面去。
在doris中,Rollup的使用频率比较高,但是现如今在真实的环境里面使用物化索引的频率比Rollup更高,因此大家在实际场景里面根据实际的需求来进行选择。
在Doris中,我们可以自己创建Rollup,使用的sql语句类似于:
alter table user add rollup rollup_name_idcard(name,idcard)
如果需要查看某张表有哪些Rollup的话,可以使用如下的sql命令:
desc user all;
这里的rollup用大白话来说,我们一般有如下的作用:
1、更改字段顺序,利用doris的索引来增加查询效率 2、在数据仓库的使用环境下,利用rollup在基础表里面提取出一些小表,用以进行数据分析或者小规模数据提取。
这里的rollup更改字段顺序这块可以看下后面关于doris的前缀索引的部分。就能很直观的明白rollup的使用。
在基础表的基础上我们创建的rollup表一般不需要我们显示的使用,我们在查询的时候还是直接在基础表里面编写对应的sql,然后doris的执行引擎在推算当前的sql会命中rollup表的时候,doris会自动在rollup表里面执行。如果我们需要查看当前的sql是否命中rollup表的时候,可以使用 explain + sql语句的方式来查看是否命中rollup表。
最后补充一下官方对于Rollup的解释:
1、ROLLUP 最根本的作用是提高某些查询的查询效率(无论是通过聚合来减少数据量,还是修改列顺序以匹配前缀索引)。因此 ROLLUP 的含义已经超出了 “上卷” 的范围。这也是为什么我们在源代码中,将其命名为 Materialized Index(物化索引)的原因。 2、ROLLUP 是附属于 Base 表的,可以看做是 Base 表的一种辅助数据结构。用户可以在 Base 表的基础上,创建或删除 ROLLUP,但是不能在查询中显式的指定查询某 ROLLUP。是否命中 ROLLUP 完全由 Doris 系统自动决定。 3、ROLLUP 的数据是独立物理存储的。因此,创建的 ROLLUP 越多,占用的磁盘空间也就越大。同时对导入速度也会有影响(导入的ETL阶段会自动产生所有 ROLLUP 的数据),但是不会降低查询效率(只会更好)。 4、ROLLUP 的数据更新与 Base 表是完全同步的。用户无需关心这个问题。 5、ROLLUP 中列的聚合方式,与 Base 表完全相同。在创建 ROLLUP 无需指定,也不能修改。 6、查询能否命中 ROLLUP 的一个必要条件(非充分条件)是,查询所涉及的所有列(包括 select list 和 where 中的查询条件列等)都存在于该 ROLLUP 的列中。否则,查询只能命中 Base 表。 7、某些类型的查询(如 count(*))在任何条件下,都无法命中 ROLLUP。具体参见接下来的 聚合模型的局限性 一节。 8、可以通过 EXPLAIN your_sql; 命令获得查询执行计划,在执行计划中,查看是否命中 ROLLUP。 9、可以通过 DESC tbl_name ALL; 语句显示 Base 表和所有已创建完成的 ROLLUP。
还没有评论,来说两句吧...