在前面其实我们介绍过物化视图,但是总体来说比较概念化,这篇文章我们再详细的介绍下doris的物化视图的使用。
一、什么是物化视图
在doris的0.12版本之前,我们习惯使用rollup表进行数据的聚合等操作,在doris的0.12版本之后,相信有实战经验的同学都会迁移到使用物化视图来做预计算的操作。那么什么是物化视图呢?
物化视图其实就是将预先计算好的数据集存储在doris中的一个特殊的表。类似于我们在mysql中使用的视图的概念。
在doris中使用物化视图会涉及到如下信息:
1、预计算,就是在明细表的基础上对数据进行巨汗函数计划,提前把数据计算好。 2、物理表,就是这个物化视图在doris中,他其实也是一张实际存在的物理表,需要占用doris的实际物理存储空间。
二、物化视图的适用场景
2.1、有同时查询数据明细及固定维度的查询业务场景
举个例子:在商城系统的订单表里面,我们就会存在查询订单明细数据的需求,同时也需要对品类,商家,店铺等进行固定维度查询的需求。
2.2、仅涉及表中一小部分行或者列数据的查询业务场景
举个例子:在saas商城系统里面,每一个独立的商家需要查询归属于自己店铺的那一部分数据。同时例如商城订单表,例如包含的字段有很多(例如:订单id,店铺id,订单金额,优惠券等),那么运营人员可能只需要查询店铺当月的应收金额这样的需求。
2.3、包含耗时的聚合查询
举个例子:在实际业务中有涉及到求和、去重等这样的一些统计性耗时的任务,此时使用物化视图就非常合适
2.4、需要匹配不同的前缀索引的查询
三、物化视图的优势有哪些
3.1、查询性能的提升
在类似数据大盘展示的业务中,我们使用传统的mysql经常会进行实时统计,最终导致页面加载的耗时非常长,如果使用物化视图这种预计算结果,那么在实际需求进行查询的时候,直接查询结果即可,不再需要进行实时计算。
3.2、数据一致性的保障
在doris中物化视图和底层明细数据表的数据写入是同步操作的,非异步操作。因此最终查询的计算结果和明细数据是完全一致的。
四、物化视图支持哪些聚合函数
1、sum 2、min 3、max 4、count 5、bitmap_union 6、hll_union
五、实战物化视图的使用
5.1、案例1:通过预计算sql,把分组查出来.
背景说明:
1、创建一张学生表,带有姓名、班级、科目、分数、录入时间等
2、提前预聚合姓名、科目、分数
实操
1、创建sql
CREATE TABLE IF NOT EXISTS test.student ( `stu_id` int COMMENT "学生id", `stu_name` VARCHAR(20) COMMENT "姓名", `class` VARCHAR(20) COMMENT "班级", `stu_score` INT default '0' COMMENT "错误详细信息", `subject` VARCHAR(20) COMMENT "科目", `timestamp` DATETIME NOT NULL COMMENT "记录时间" ) DUPLICATE KEY(`stu_id`, `stu_name`,`class`,`stu_score`,`subject`,`timestamp`) DISTRIBUTED BY HASH(stu_id) PROPERTIES ("replication_num"="1"); insert into student(`stu_id`,`stu_name`,`class`,`stu_score`,`subject`,`timestamp`) values(1,'张三','2.1班',95,'语文','2022-09-23 10:45:00'); insert into student(`stu_id`,`stu_name`,`class`,`stu_score`,`subject`,`timestamp`) values(2,'李四','2.2班',93,'语文','2022-09-23 10:45:00'); insert into student(`stu_id`,`stu_name`,`class`,`stu_score`,`subject`,`timestamp`) values(1,'张三','2.1班',100,'数学','2022-09-23 10:45:00');
2、创建物化视图
CREATE MATERIALIZED VIEW stu_cal_score as select `stu_name`,`subject`, sum(`stu_score`) from student group by `stu_name`, `subject`;
3、执行查询看是否命中物化视图
explain select `stu_name`,`subject`, sum(`stu_score`) from student group by `stu_name`, `subject`;
此时我们可以看到命中了物化视图表。
5.2、案例2:数据去重
背景:
还是使用上诉的背景
实操:
1、插入数据
insert into student(`stu_id`,`stu_name`,`class`,`stu_score`,`subject`,`timestamp`) values(1,'张三','2.1班',99,'数学','2022-09-23 10:45:00');
2、创建视图
CREATE MATERIALIZED VIEW stu_duplicate_removal AS SELECT stu_id,stu_name,class FROM student GROUP BY stu_id,stu_name,class;
3、查询
explain SELECT stu_id,stu_name,class FROM student GROUP BY stu_id,stu_name,class;
已命中物化视图。
还没有评论,来说两句吧...