持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第25天,点击查看活动详情
查询改写
最后再根据选择出的最优解,改写查询。
例如:刚才的查询选中mv_1后,将查询改写为从mv_1中读取数据,过滤出日志为2月10日的mv_1中的数据然后返回即可。
有些情况下的查询改写还会涉及到查询中的聚合函数的改写。比如业务方经常会用到Count、Distinct对PV、UV进行计算。
例如:
广告点击明细记录表中存放哪个用户点击了什么广告,从什么渠道点击的,以及点击的时间。并且在这个Base表基础上构建了一个物化视图表,存储了不同广告不同渠道的用户Bitmap值。
由于bitmap_union这种聚合方式本身会对相同的用户user_id进行一个去重聚合。当用户查询广告在Web端的UV的时候,就可以匹配到这个物化视图。匹配到这个物化视图表后就需要对查询进行改写,将之前的对用户id求 count(distinct) 改为对物化视图中bitmap_union列求count。
所以最后查询取物化视图的第一和第三行求Bitmap聚合中有几个值。
适用场景
上面介绍了两种数据模型——明细模型和聚合模型,也介绍了两种预聚合方式物化视图和Rollup。那么在数据模型的选择上:
-
如果用户的分析都是固定维度的分析类查询,比如报表类业务,且完全不关心明细数据时,则用聚合模型最合适。
-
如果用户需要查询明细数据,比如交易明细,则用明细模型合适。
对于物化视图和Rollup来说:
- 他们的共同点都是通过预聚合的方式来提升查询效率。
实际上物化视图是Rollup的一个超集,在覆盖Rollup的工作同时,还支持更灵活的聚合方式。
因此,如果对数据的分析需求既覆盖了明细查询也存在分析类查询,则可以先创建一个明细模型的表,并构建物化视图。