数据立方体 解密

数据立方体和传统数据库的差别在于数据立方体即Cube把很多原来要用数据库的group by操作来达到的效果通过其独有的存储形式予以加速, 用户可以方便地下钻, 切面 看到各种聚合的数据的结果。

试想一下,如果一个cube拥有3个维度,为了计算在各个维度上的聚合,就要进行2^3次计算,如果有10个维度就要进行2^10次聚合计算,随着维度的增加,计算量也陡增。此外经过一次聚合后,得到的不是一个值而已,是一个少了若干维度的子cube,要将所有的cube存储起来会占用大量的磁盘空间。

所以完全预存所有可能的度量值显然是不可能的。

巧妙之处就在于利用数据的稀疏性。举个例子:

一幢楼有10层,每层有3个大间,每个大间有甲乙丙丁4个小隔间,现在把这幢楼当成数据立方体,度量值就是住的人数。

101甲有3人(一楼01室甲间),

103丙有2人,

202乙有4人,

203丁有2人,

302乙有1人,

然后从4楼往上,只有702甲住了2人。

有很多的空的房间就象征着稀疏。

这时我们会发现如果用户查询的4楼以上的人数数据,且未指明其他两个维度的话,其实只要返回一个702甲的人数就可以了。或者用户查询所有丙室的人数,也只要返回103丙有2人。仿佛103丙这一间小房间却在特定的聚合条件下覆盖了一大片区域。如果我们用符号“*”来表示All,那么103丙覆盖了:

(*,*,丙)

这样一个子cube。

用术语来说(*,*,丙)和(1,*,丙)和(*,3,丙)其实归根结底就是103丙,它们叫“同基类”。那么数据立方体在预存聚合值的时候就只要存同基类中的一个值就可以了,然后通过一定存储形式指明那些区域是属于这个同基类的就可以了,大幅减少了储存空间和Process时的IO消耗。


具体通过什么样的形式来指明同基类可以参考这篇论文:http://www.docin.com/p-49564349.html

再贴一片关于SSAS调优的文章: https://ask.hellobi.com/blog/liangyong/311



posted @ 2017-04-07 23:11  爱知菜  阅读(20)  评论(0编辑  收藏  举报