多维数据库 Oracle Essbase 和 IBM Cogons 底层原理
多维数据库(Multi Dimensional Database,MDD)使用Dimension(维度)和Cube(数据立方体、数据集市)模型描述数据。
多维数据模型
关系型数据库(Relational Database,RDB)中的星型结构或雪花型结构就是模拟上述多维模型结构的,但无法提供真正意义上的多维数据分析能力,这里不做过多解释。
下文讲解Oracle Essbase以及IBM Cogons这种真正的多维数据库的原理。
多维数据库中模型结构与事实数据分别以概要文件(profile)和数据块(data block)的形式存在。
profile和data block
概要文件用来描述以下信息:
- 维度和维度成员信息
- 与维度相关的层级(Hierarchy)和级别(Level)信息
- Cube的描述性信息,以及Cube与维度的关联性
- 其他描述性的信息,如实体模型属性
Cube中度量数据存放在data block中,data block可以被理解成为多维数组结构,其大小与相关维度的明细成员数量有直接关系。
计算公式:data block size = 维度1明细成员总数 * 维度2明细成员总数 * …… * 维度N明细成员总数
数据块容量等于相关维度明细成员数量的笛卡尔积。
数据块大小
明细度量值一般采用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)。
当数据块极度膨胀并且存在很多数据空洞的时候,会极大地浪费存储空间,并且可能导致数据存储无法实现。
极度膨胀和存在大量空洞的多维数组
为了解决数据空洞和数据膨胀问题,引入了密集维度组合和稀疏维组合的概念。
判断维度组合是密集还是稀疏的原则是看其所对应的明细度量值的存在情况,例如:
- 北京地区只有ABC三种手机的销售额,天津地区只有BCD三种手机的销售额,河北地区卖出的手机只有AE两种,表明并不是每个地区对于每一种手机都有销售额,所以地区与产品属于稀疏的维度组合。
- 2018年的四个季度都有手机销售额,所以日期维度自身可以构成密集的维度组合。
注意!在其他讲解多维数据库的文章中都把维度分为稀疏维与密集维,这是非常错误的,对于维度本身来讲没有稀疏与密集之分,稀疏与密集表示的是维度之间的组合!对于有N个维度的Cube而言,如果其只有一个维度退化成索引,或者有N - 1个维度退化成索引,则此时稀疏与密集的维组合只包含一个维度,但这只是一种特例,并不代表维度本身是稀疏或密集的。
在引入稀疏与密集的维度组合之后,原本由于数据空洞和数据爆炸而失控的数据块结构将变成索引和密度相对较高的小数据块结构。
索引和小数据块
之前数据文件大小为3 * 4 * 5 = 60,结构变换之后每个小数据块大小为4(共8个),在不计算索引所占存储大小的情况下,存储容量变为原来的一半。
度量值的变化可能引起稀疏维度组合和密集维度组合的改变,如下图所示。
重构
虽然解决了数据空洞和数据爆炸的问题,但稀疏与密集的维组合所带来的负作用是一旦度量值的变化导致了数据块密度中心的改变,相关的索引和子数据块必须重构,而这种重构的性能代价与时间成本是极为昂贵的。Cogons、Essbase等传统多维数据库以及其他MOLAP都存在此问题。
基于矢量计算引擎(Vector Calculation Engine)的新型分布式多维数据库很好的解决了数据重构问题。
矢量计算引擎将海量数据的运算从多维数据库核心分离出来,进而将多维分析时的逻辑运算与聚集计算解耦。多维数据库核心只负责逻辑运算,完全不需要再考虑数据量的问题。矢量计算引擎采用极为简单的数据结构存储TB、PB级数据,并且只负责进行一种算法上极为简单的聚集运算,针对此种特性,适宜采用更加接近底层的编程语言进行开发(如C语言),不仅得到了性能上的提升,也因为数据存储结构的简单而获得了更加稳定的运行效果。
基于矢量计算引擎的多维数据库
如上图所示,在多维数据库内核角度来看,矢量计算引擎是更加底层的一种基础服务,所以可以根据各种应用场景切换不同的实现方式,而这一切对于多维数据库内核来说都是透明的,多维数据库本身对更上层的应用提供一致的数据查询能力,从而更好的支持了100%面向业务的探索式数据分析能力。
多维数据库 Oracle Essbase 和 IBM Cogons 底层原理的更多相关文章
- MySQL数据库 | MySQL调优|MySQL底层原理|MySQL零基础新手教程
MySQL数据库安装 一.Windows 环境下安装 A.下载 MySQL Select Operating System: Microsoft Windows 快捷下载:mysql-8.0.22-w ...
- 国产多维数据库 NeuralCube!中国人自己的大数据底层核心技术!
商业转载请联系作者获得授权,非商业转载请注明出处. 提到‘数据库’,首先被想到的肯定是Oracle.DB2.SQL Server.MySql这些传统的关系型数据库.数据库的概念是非常宽泛的,除了上述的 ...
- Oracle Essbase入门系列(一)
1. 开篇序 本文是几年前做Hyperion Planning项目时写的,后来陆陆续续有些补充.本来打算将整个EPM写一系列的教程,但HFM写到1/3就没动力了.不过至少Essbase这部分是完整的. ...
- Oracle Essbase入门系列(二)
本篇开始会一个三口之家的家庭财务数据库为例,讲述Essbase的功能和开发.为了说明EPM应用程序的管理和开发过程,会绕一些弯路,不使用EAS,而尽量用EPMA. 创建应用程序 首先登陆到Worksp ...
- FineReport连接多维数据库示例及操作
1. 描述 FineReport连接多维数据库,首先要通过数据连接将多维数据库与FineReport连接起来,然后在数据连接的基础上新建多维数据库XMLA数据集,用于模板设计. 2.XMLA数据连接 ...
- Oracle Essbase入门系列(三)
数据库计算 Essbase中单元格的数据可以是外部输入或计算而得,单元格因而分为输入单元格和计算单元格.计算单元格的计算方法可以通过大纲中维度成员的合并计算符和公式脚本定义,此称为大纲计算定义. 例1 ...
- 开发环境中快速部署Oracle Essbase(Rapid deployment of oracle essbase in development envrioments)
版本:Oracle Enterprise Performance Management System Release11.1.2.4 快速部署自动安装组件: Essbase Oracle Essbas ...
- 各种数据库(oracle、mysql、sqlserver等)在Spring中数据源的配置和JDBC驱动包----转
在开发基于数据库的应用系统时,需要在项目中进行数据源的配置来为数据 库的操作取得数据库连接.配置不同数据库的数据源的方法大体上都是相同的,不同的只是不同数据库的JDBC驱动类和连接URL以及相应的数据 ...
- Oracle实例和Oracle数据库(Oracle体系结构)
--========================================== --Oracle实例和Oracle数据库(Oracle体系结构) --==================== ...
随机推荐
- [Swift]LeetCode895. 最大频率栈 | Maximum Frequency Stack
Implement FreqStack, a class which simulates the operation of a stack-like data structure. FreqStack ...
- MySQL 规范及优化
一.建库建表优化 1.核心规范(推荐) 表字符集选择UTF8 (“表情”字段单独设置为其他字符集) 存储引擎使用INNODB 不在库中存储图片.文件等 使用可变长字符串(varchar) 每张表数据量 ...
- CentOS随笔——Service与防火墙关闭
Service后台服务管理 基本语法 service 服务名 start 开启服务 service 服务名 stop 关闭服务 service 服务名 restart 重启服务 service 服务名 ...
- 95%的技术面试必考的JVM知识点都在这,另附加分思路!
概述:知识点汇总 jvm的知识点汇总共6个大方向:内存模型.类加载机制.GC垃圾回收是比较重点的内容.性能调优部分偏重实际应用,重点突出实践能力.编译器优化和执行模式部分偏重理论基础,主要掌握知识点. ...
- BBS论坛(十九)
19.1.cms轮播图管理页面布局 (1)cms/cms_base.html <li class="nav-group banner-manage"><a hre ...
- 如何写好css系列之button
现代前端行业的发展,如果你在css的时候,还没有利用一些预编译工具,是否觉得自己太low了.但你是否考虑过搭建一套自己前端框架.可能你会想这是否有必要,因为基础有boostrap,组件库有:easyu ...
- C#版 - Leetcode 191. Number of 1 Bits-题解
版权声明: 本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. C#版 - L ...
- 前端笔记之JavaScript(三)关于条件判断语句、循环语句那点事
一.条件分支语句 条件分支语句,也叫作条件判断语句,就是根据某种条件执行某些语句,不执行某些语句. JS中有三种语法是可以表示条件分支的 1.1 if……else…… 条件分支的主力语法,这个主力语法 ...
- 手把手教你如何优雅的使用Aop记录带参数的复杂Web接口日志
前言 不久前,因为需求的原因,需要实现一个操作日志.几乎每一个接口被调用后,都要记录一条跟这个参数挂钩的特定的日志到数据库.举个例子,就比如禁言操作,日志中需要记录因为什么禁言,被禁言的人的id和各种 ...
- Chapter 5 Blood Type——29
"We're meeting at my dad's store, at ten." “十点,我们在我爸的店见面.” His eyes flickered to Edward ag ...