如果大家熟悉Oracle的物化视图,就能够很容易理解为什么这种方式能够提供快速计算的能力。因为所有维度都是按照层次关系组织起来的:
比如对于区域维度而言,很显然全国的销售额一定是各个省的销售额的总和,而各个省的销售额一定是下面各地市销售额的总和,这种天然的汇总关系为实现这种按层次的汇总提供可能性,因为我们通过MOLAP可以很容易计算出各个层次的累计数值,这样做查询的时候就能够很快地把所需要的数值拿出来(不管你要的是哪一级的汇总)
从这种角度来说,使用Oracle关系数据库来模拟多维数据库是可能的,只要你建立足够多的物化视图,在每一个层次都提供汇总计算,当然这个是理论上的,真正这么去实现在很多应用里根本就不现实,事实上,我一直在想,物化视图的技术是不是就是受MOLAP数据库的启发产生出来的呢?
理解Essbase计算
多维数据库里的数据有些是从源数据导入的,有些则是运算出来的,比如对于一个最小时间单位为天的分析销售量的立方体,每天的销售量都是从源系统导入到Essbase里的,但是对于每个月的销售量,则是由Essbase根据更加细粒度的数据计算出来的,所以立方体里的数据在这种区别下可以分为两大类数据,一类是从源系统导入的,另一类则是Essbase运算出来的,一般而言输入数据都是level 0数据(最低端的叶子)。
由Essbase根据导入的数据再计算生成我们所需要的别的数据的过程称之为calculation,Calculation也分为两种:
第一种方式是按照outline层次预先设定的方式进行叠加(Consolidation operator)。
第二种方式是使用自己写的计算公式进行计算(member formula)。
我们通过以下的例子来说明第一种的计算方式,在outline的设计的时候,一个必须指定的属性就是所谓的指定层次间的汇总关系(Consolidation operator),缺省的汇总关系总是相加,如下图:

Qtr1=Jan+Feb+Mar
请注意+号不是唯一能够使用的符号,还可以有-(减),*(乘),/(除),%(百分比)等,比较特殊的是~(排除,意即该成员不参与到运算里),这种计算的设计里最重要的是同一层次的成员出现的顺序,因为同一层次的计算顺序是按照出现的顺序来进行,而不是按照通常的运算符号本来的优先次序。
这种基于consolidation操作符进行运算的关系也是推荐的运算方式,因为这种方式可以提供更好的性能,而且对于使用者而言更加直观和容易理解。
Outline里另一种计算是使用成员公式(member formula)来进行,有时候当成员并不是按所想要的次序出现的时候,就需要使用公式去表现成员的关系去计算一个所需要的值,使用这种自定义的计算公式能够描述更加复杂的计算关系,essbase提供了逻辑测试关系符(if else),各种统计和财务函数来方便计算。
维度计算的优先次序是先计算account维度的值,其次是时间维度的值,然后是计算其他稠密维度上的值,最后再计算稀疏维度上的值。而计算two pass的值则是在其他所有计算都完成之后。