物化视图的使用场景有:
分析需求覆盖明细数据查询查询
对明细数据的任意维度上卷聚合分析
创建物化视图
通过下面命令就可以创建物化视图了。创建物化视图是一个异步的操作,也就是说用户成功提交创建任务后,DorisDB会在后台对存量的数据进行计算,直到创建成功。
CREATE MATERIALIZED VIEW
查看物化视图创建状态
由于创建物化视图是一个异步的操作,用户在提交完创建物化视图任务后,需要通过命令检查物化视图是否构建完成, 命令如下:
SHOW ALTER MATERIALIZED VIEW FROM db_name;
或
SHOW ALTER TABLE ROLLUP FROM db_name;
如果State为"FINISHED"说明基表到物化视图已经创建完成.
查看基表的物化视图
查看物化视图的表结果, 需用通过基表名进行
desc sales_records all;
查看执行计划
:OlapScanNode |
| TABLE: sales_records |
| PREAGGREGATION: ON |
| partitions=1/1 |
| rollup: amt |
| tabletRatio=10/10 |
| tabletList=2344 |
| cardinality=0 |
| avgRowSize=0.0 |
| numNodes=1 |
| use vectorized: true
查询计划树中的OlapScanNode显示PREAGGREGATION: ON和rollup: amt说明使用物化视图store_amt的预先聚合计算结果. 也就是说查询已经命中到物化视图 amt, 并直接从物化视图中读取数据了。
删除物化视图
DROP MATERIALIZED VIEW IF EXISTS db.mv;
删除处于创建中的物化视图, 需要先取消异步任务, 然后删除物化视图, 以表db0.table0上的物化视图mv为例:
首先使用获得JobId, 执行命令:
show alter table rollup from db0;
其中JobId为22478, 取消该Job, 执行命令:
cancel alter table rollup from db0.table0 (22478);
使用物化视图注意事项
①物化视图的数据组织形式和基表,RollUp表相同;用户可以在新建的基表时添加物化视图,也可以对已有表添加物化视图,这种情况下,基表的数据会自动以异步方式填充到物化视图中。基表可以拥有多张物化视图,向基表导入数据时,会同时更新基表的所有物化视图,数据导入操作具有原子性,因此基表和它的物化视图保持数据一致。
②物化视图创建成功后,用户的原有的查询基表的SQL语句保持不变,DorisDB会根据自动选择一个最优的物化视图,从物化视图中读取数据并计算
③物化视图的聚合函数的参数仅支持单列, 比如: sum(a+b)不支持。
④如果删除语句的条件列,在物化视图中不存在,则不能进行删除操作。如果一定要删除数据,则需要先将物化视图删除,然后方可删除数据。
⑤单表上过多的物化视图会影响导入的效率:导入数据时,物化视图和 base 表数据是同步更新的,如果一张表的物化视图表超过10张,则有可能导致导入速度很慢。这就像单次导入需要同时导入10张表数据是一样的。
⑥物化视图的创建语句目前不支持JOIN和WHERE, 也不支持GROUP BY的HAVING子句.
⑦不能同时创建多个物化视图, 只能等待上一个物化视图创建完成, 才能创建下一个物化视图.
查询基表语句
SELECT select_expr[, select_expr ...]
FROM [Base view name]
GROUP BY column_name[, column_name ...]
ORDER BY column_name[, column_name ...]
仅支持不带表达式计算的单列、聚合列。
聚合函数的参数只能是不带表达式计算的单列。
至少包含一个单列。
所有涉及到的列,均只能出现一次。
base view name:物化视图的原始表名,必填项。同时要求是单表,且不是子查询。
group by:物化视图的分组列,选填项。不填则数据不进行分组。
order by:物化视图的排序列,选填项。
排序列的声明顺序必须和 select_expr 中列声明顺序一致。
如果不声明 order by,则根据规则自动补充排序列。 如果物化视图是聚合类型,则所有的分组列自动补充为排序列。 如果物化视图是非聚合类型,则前 36 个字节自动补充为排序列,如果前36个字节的列数小于3,将使用前三列。如果自动补充的排序个数小于3个,则前三个作为排序列。
三列类型的字节数之和为 4(INT) + 8(BIGINT) + 16(DECIMAL) = 28 < 36
如果 query 中包含分组列,则排序列必须和分组列一致。