最近我们一直在使用doris做数仓,在对外接口平台的开发过程中我们结合业务做了大量的sql查询接口,生产环境里面由于数据量确实非常大,所以部分sql使用传统的查询的时候非常的慢。所以需要进一步做sql优化。查询慢目前有两个方式解决:
第一个解决方案是:使用rollup改变一下前缀索引的顺序或者减少一些数据量。
第二个解决方案是:使用物化视图提前对数据进行预聚合。
介绍下rollup与物化视图的区别
相同点:
1、两者都是为了加快数据查询速度的。
2、rollup能做的事情物化视图都可以做。
3、物化视图是rollup的超集。
不同点:
1、rollup一般应用于减少数据查询字段的场景
2、rollup一般应用于更改前缀索引,增加查询效率的场景。
3、物化视图一般用于预聚合,大多应用于数据仓库的非ods层
介绍下rollup与物化视图的优缺点
优点:减少了查询时间,增加了查询效率
缺点:增加了数据存储的时间,增加了大量的物理磁盘空间占用。
介绍下rollup与物化视图的创建方式:
rollup的创建方式:alter table add rollup(列1,列2,列3)
物化视图的创建方式是:create materialized view store_amt as select查询语句
物化视图的常用场景:
1、统计sum的场景
2、统计count(distinct)的场景,一般转化为 bitmap_union
进行操作。
3、和rollup一样,改变前缀索引(例如:CREATE MATERIALIZED VIEW mv_1 as SELECT k3, k2, k1 FROM tableA ORDER BY k3)
备注:物化视图的sql语句里面的select部分,一般都会带有group by或者order by这些语句。
物化视图的局限性
1、我们知道物化视图是预聚合后的数据,那么在sql查询的时候,聚合参数是不支持多余1列的计算类聚合,例如:sum(a+b)就不支持
2、在删除数据的时候,如果当前表有10个字段,物化视图里面有6个字段,此时需要删除其中一个物化视图中没有的字段,此时是不能删除的,只能先删除所有的物化视图,再删除数据,再重新创建物化视图。
3、每张表的物化视图建议合理创建,数量一般不建议超过3个,超过后导入数据性能贼慢。
4、物化视图,同一列不能同时出现在多个聚合函数里面,例如:select sum(a), min(a) from table是不支持的。
5、在unique key的原始表中,不适合使用物化视图。
还没有评论,来说两句吧...