多维数据库(Multi Dimensional Database,MDD)使用Dimension(维度)和Cube(数据立方体、数据集市)模型描述数据。算法
多维数据模型数据库
关系型数据库(Relational Database,RDB)中的星型结构或雪花型结构就是模拟上述多维模型结构的,但没法提供真正意义上的多维数据分析能力,这里不作过多解释。编程
下文讲解Oracle Essbase以及IBM Cogons这种真正的多维数据库的原理。数组
多维数据库中模型结构与事实数据分别以概要文件(profile)和数据块(data block)的形式存在。数据结构
profile和data block编程语言
概要文件用来描述如下信息:分布式
Cube中度量数据存放在data block中,data block能够被理解成为多维数组结构,其大小与相关维度的明细成员数量有直接关系。性能
计算公式:data block size = 维度1明细成员总数 * 维度2明细成员总数 * …… * 维度N明细成员总数3d
数据块容量等于相关维度明细成员数量的笛卡尔积。blog
数据块大小
明细度量值通常采用double类型,按8bytes算,上图所描述的Cube的数据块大小为480bytes。
除了数据块中的明细度量值外,其余非明细度量值并无直接存储,由于其能够经过对应的明细度量值计算出来。
非明细度量值计算方式
一些不存在的度量值会形成数据空洞问题,假设2018年4季度河北省B品牌手机的销售量是未知的,则会在数据块中产生一个空洞。
注意:数据空洞表示不存在的值,与数值0的意义不一样,数值0表示一个有意义的值。
若是数据空洞比较多,则数据块的数据密度就会降低,将形成存储空间的浪费。
数据空洞
除了数据空洞问题,还存在数据爆炸问题。数据块大小由所有维度明细成员数量的笛卡尔积决定,假如某个Cube关联三个维度,每一个维度明细成员数量均为100,则:data block size = 100 ^ 3 = 1000000,若是度量值按double类型存储(8bytes),数据块文件大约为7.62M。若是每一个维度明细成员数量增长至150,则数据块文件将膨胀到25.74M(data block size = 150 ^ 3 * 8bytes / 1024 / 1024)。
当数据块极度膨胀而且存在不少数据空洞的时候,会极大地浪费存储空间,而且可能致使数据存储没法实现。
极度膨胀和存在大量空洞的多维数组
为了解决数据空洞和数据膨胀问题,引入了密集维度组合和稀疏维组合的概念。
判断维度组合是密集仍是稀疏的原则是看其所对应的明细度量值的存在状况,例如:
注意!在其余讲解多维数据库的文章中都把维度分为稀疏维与密集维,这是很是错误的,对于维度自己来说没有稀疏与密集之分,稀疏与密集表示的是维度之间的组合!对于有N个维度的Cube而言,若是其只有一个维度退化成索引,或者有N - 1个维度退化成索引,则此时稀疏与密集的维组合只包含一个维度,但这只是一种特例,并不表明维度自己是稀疏或密集的。
在引入稀疏与密集的维度组合以后,本来因为数据空洞和数据爆炸而失控的数据块结构将变成索引和密度相对较高的小数据块结构。
索引和小数据块
以前数据文件大小为3 * 4 * 5 = 60,结构变换以后每一个小数据块大小为4(共8个),在不计算索引所占存储大小的状况下,存储容量变为原来的一半。
度量值的变化可能引发稀疏维度组合和密集维度组合的改变,以下图所示。
重构
虽然解决了数据空洞和数据爆炸的问题,但稀疏与密集的维组合所带来的负做用是一旦度量值的变化致使了数据块密度中心的改变,相关的索引和子数据块必须重构,而这种重构的性能代价与时间成本是极为昂贵的。Cogons、Essbase等传统多维数据库以及其余MOLAP都存在此问题。
基于矢量计算引擎(Vector Calculation Engine)的新型分布式多维数据库很好的解决了数据重构问题。
矢量计算引擎将海量数据的运算从多维数据库核心分离出来,进而将多维分析时的逻辑运算与汇集计算解耦。多维数据库核心只负责逻辑运算,彻底不须要再考虑数据量的问题。矢量计算引擎采用极为简单的数据结构存储TB、PB级数据,而且只负责进行一种算法上极为简单的汇集运算,针对此种特性,适宜采用更加接近底层的编程语言进行开发(如C语言),不只获得了性能上的提高,也由于数据存储结构的简单而得到了更加稳定的运行效果。
基于矢量计算引擎的多维数据库
如上图所示,在多维数据库内核角度来看,矢量计算引擎是更加底层的一种基础服务,因此能够根据各类应用场景切换不一样的实现方式,而这一切对于多维数据库内核来讲都是透明的,多维数据库自己对更上层的应用提供一致的数据查询能力,从而更好的支持了100%面向业务的探索式数据分析能力。