本文参考斯坦福著名论文:implementing data cubes efficiently。

在kylin(麒麟)中,有一项关键技术叫做预计算:简单的说,我们预先计算出用户可能查询的结果,每一种可能我们称之为一个cuboid,所有的cuboid组合起来叫一个cube。我们把cube存储起来,当用户需要查询数据的时候,就不用查找原始数据表,直接查询cube就能得到想要的数据,这是让kylin能在秒级甚至亚秒级查询亿级以上的数据保证。

一个原始表n个dimension(维度),理论上就有2^n个cuboid

所以,存在一个问题,一个原始表的维度可能很多,我们不可能将所有的可能都存储起来,这将极大的耗费资源,为此我们需要将需要的cuboid创建出来,优化kylin系统

在这里介绍一个概念:rollup

在TCP-D 数据库中有三个属性(dimension):part,supplier,customer和measure:total sales。我们有八种可能聚合这些属性.

1、part,supplier,customer(6M,600万行)

2、part,supplier(0.8M)

3、part,customer(6M)

4、supplier,customer(6M)

5、part(0.2M)

6、supplier(0.1M)

7、customer(0.1M)

8、none(1)

用户可能使用任意一条query语句,例如用户查询sales group by part,如果我们建立了5的物化视图,那我们就可以直接查询 视图5,我们只需要 扫描20万行的数据表,我们当然也可以使用视图3来查询,但这样我们就要扫描600万行数据,当没有建立起5的物化视图的时候,我们只能通过其他视图进行扫描(如 1 、2、 3),这种使用更多dimension的视图来查询更少dimension的过程就是rollup。如果我们要建立的物化视图不能够很大降低查询效率的时候,我们是没有不要构建的,比如 3和4,所以如何有效的实现cube就是我们需要关注的地方。在kylin里,base cuboid是一定会构建的(具有全部dimension)。

论文中定义了一个符号 q1 =<q2 ,表示q1查询语句的结果能用q2查询到(和rollup概念相同)

我们选择构建哪个cuboid的依据是我们构建了这个cuboid后所带来的查询效益(benefit),这里我们判断的依据是查询表减少的行数,或者花销(cost)减少的量。

论文中使用贪心算法对cuboid进行选择,例子如下:

kylin内幕--如何有效实现cubes

每一个数代表查询这个cuboid的花销(cost)

base view a是一定要构建的,假设我们要选择构建三个cuboid的,那接下来选择那个呢?

我们分别计算构建 b c d e f g h的效益,如下:

kylin内幕--如何有效实现cubes

这就是kylin所使用的选择构建物化视图的算法

 

 

相关文章:

  • 2021-04-11
  • 2021-08-16
  • 2023-02-09
  • 2021-08-01
  • 2021-07-15
  • 2021-12-09
  • 2021-12-23
猜你喜欢
  • 2021-07-17
  • 2021-11-22
  • 2022-12-23
  • 2022-12-23
  • 2021-07-12
  • 2021-12-10
  • 2021-08-29
相关资源
相似解决方案