内存数据库实现原理探讨

2018-07-28 07:18黄伟梅
电脑知识与技术 2018年15期

黄伟梅

摘要:该文对内存数据库的实现原理进行探讨,以实际数据为样本进行统计分析,对数据存储结构、数据字典、数据压缩、消除冗余等技术进行了探讨。同时比对了传统数据库和内存数据库之间的优势和劣势。

关键词:内存数据库;列式存储;数据字典;数据压缩;消除冗余

中图分类号:TP391 文献标识码:A 文章編号:1009-3044(2018)15-0010-04

1 引言

学生面临着这样一种困境,在校学的都是传统的数据库,可一旦出来社会就业,却面对着各种各样的新数据库技术,尤其是最新的内存数据库技术,未免显得有点措手不及,跟不上潮流。作为一名职业技术教育的教师,完成课本教学是前提,但远远不够,在技术更新换代的关键时间点,必须做好充分技术准备,才能给学生做好就业准备。本文对当前较新的数据库技术——内存数据库进行研究和探讨,并以企业的一个实际应用作为实例。

对于大多数企业而言,在越来越激烈的竞争当中生存下来将变得更加困难,甚至可能在几年内就面临破产。相对而言,收集数据已经不是第一要务,更重要的是如何把数据迅速地转化为业务分析结果,抢先于竞争对手,在激烈的市场竞争中寻找到更多商机,留住或者挖掘出更多优质客户,为企业决策提供重要数据支持。

决策者为了达到公司盈利增长的目标,迅速地做出企业决策,需要更快速地分析财务和绩效数据,这一切都表明企业对报表快速分析的需求在不断增长。

同时,企业对其他数据的分析需求,特别是非结构化数据的分析需求不断增长,比如图片、音频、视频数据。只有更好地提供前瞻性的预测分析,才能完成盈利增长的目标。

但是传统数据库已经不能很好满足目前的应用,快速分析高度依赖高速数据库,而内存数据库恰恰满足了这一需求。

随着硬件的不断发展,内存数据库的处理效率大幅提升,发展趋势是联机事务处理OLTP(on-line transaction processing)和联机分析处理OLAP(on-line analytical processing)的区别得以消灭。

目前市面上也有不少内存数据库产品,下面以SAP ERP的内存数据库管理系统为例,对内存数据库的实现原理进行研究。其他主流数据库厂商,如Oracle也采用类似的内存数据库技术。

2 内存数据库存储方式

内存数据库管理系统,本质上是一种完全运行在内存上的大规模并行数据库管理系统(DBMS)。传统数据库受限于硬件性能,会在存储设备和CPU之间不断传输数据,所以传统数据库更多地关注计算算法的优化,着重优化硬盘的输入输出。而内存数据库拥有大量内存,硬件性能已经不是瓶颈,着力于优化CPU缓存和内存之间的数据交换。

2.1 内存中保存数据

传统数据库的数据存储在硬盘里,但数据最终还是要传输到CPU寄存器中进行运算的。硬盘价格便宜,但速度较慢。这里考虑两个速度因素,一个是存储介质的物理速度。第二个是延迟,也就是把数据从存储介质传输到CPU寄存器的速度。

而仅次于CPU寄存器速度的存储介质是内存。内存数据库把数据存放在内存中,速度得到了极大的提升。

2.2 数据持久性

内存本身是一种易失性存储介质,一旦断电,数据就会丢失。解决这个问题需要借助数据库的ACID概念,即原子性、一致性、隔离性、持久性来保证数据库事务的可靠。

SAP内存数据库在持久层采用了预先写入日志、影子分页、数据保存点等技术来保证数据修改是持久的。而日志和数据保存点保存在非易失性存储介质中,一旦发生数据丢失,SAP内存数据库可以向传统数据库一样恢复数据。技术上它首先按照最后一次数据保存点恢复,然后按照数据库日志执行没有包含的数据修改,保证数据和丢失前一致。

2.3 数据结构

关系型数据库使用二维表结构来体现数据,一张数据库表有一组垂直列,以及水平记录来表示。而计算机内存则是线性一维的,为了能够在内存存储数据,就需要把二维的数据库表结构映射到线性的内存地址上。

有两个方案,第一个是基于行的结构,把数据库表的每一行链接起来,组成一个序列,保存到线性内存地址上。另外一种方式是基于数据库表的列,把各列数据组成一个序列,每一列数据一起存储在线性内存上。下面以表1的示例表进行解析。

在实际ERP应用中,采用列式存储技术可以获得更好的数据库性能,这说明企业数据库中的大部分操作都是读操作和集合操作[1]。日常大多数数据库操作都是针对数据库表少数几列进行的。实际企业应用场景中,采用列式数据存储更加有利。

3 数据编码和压缩

实际的企业应用中,数据库大到几个T到几百个T,单靠有限的内存直接存放全部数据库表显得不现实,需要采取数据压缩技术,减少内存中数据量,这样可以降低硬件费用。

3.1字典编码及压缩

字典编码是最基本的数据压缩技术。字典编码以列为单元进行操作,通过简单的转换把列中的不同数据用不同的整数值(短整数优先)替代,将长文本值压缩为短整数值,因此并没有改变表的规模。通常情况下,企业数据的熵较低,即数据的重复度大,压缩效果较好。同一列里面数据重复越多,字段编码的作用越明显。实际商业数据库应用中,大部分列数据都只是由少量不同的值构成,比如国家代码、货币代码、大量的配置表等。以SAP ERP数据库表BPKF为例,选取前10条,见表2。我们通过图3、图4、图5、图6,看看如何将原始的数据翻译成整数编码,大幅提高效率。BKPF存储的是财务会计凭证头部信息。

我们对“公司”建立压缩列(compressed column),其他列的压缩列同理,略。

我们继续对“公司”建立倒序索引(inverted index),其他列的倒序索引同理,略。

经过统计,一个商业运行了5年的数据库表BKPF,其主要字段的重复率统计如下。

可以看到,经过5年的运行,表BKPF一共有63,688,313条行记录,主要列的重复率很高,见表3。

相比行记录的数量,很多列仅仅保存很少的不同值,字典编码技术可以对列数据进行很好的压缩。

3.2数据压缩

内存数据库一般还会采用了其他数据压缩方法,比如前缀编码(Prefix Encoding)、行程长度编码(Run-length Encoding)、族编码(Cluster Encoding)、间接编码(Indirect Encoding)、增量编码(Delta Encoding),虽然编码和解码需要耗用CPU资源,但相对于提高的数据存储效率来说,还是相当有利,可节省大量内存。编码后数据小了,处理速度也会相应提高。

4 消除冗余

1970年Codd首次提出了关系模型,它奠定了今天数据库系统的基础[2]。为了减少冗余,人们发明了关系数据库模型和数据标准化技术,比如范式[3]。传统数据库是空间换时间,把从数据库其他地方衍生出来的数据存储起来,这些数据是可以从系统的其他数据推导出来的,叫冗余数据,允许冗余数据最终达到节省计算时间的目的。但也有不利因素,我们需要维护这些数据之间的一致性,才能保证数据库的完整性,维护成本比较高。

4.1数据冗余

目前存在的数据冗余,比如,物化视图;物化汇总表;重叠造成的冗余;物化结果集。

我们以传统数据库举例,SAP ERP ECC6.0的表BKPF和BSEG,BKPF存储的是会计凭证的头部信息,BSEG存储的是会计凭证的分錄信息。在实际应用中,两张表数量巨大,记录数据动辄上亿。为了提高查询速度,系统会物理化存储他们的汇总表信息,形成物理汇总表GLT0和FAGLFLEXT。否则每次汇总计算都得等待几十秒到数分钟不等。下图是一个实际投入商业运行5年的SAP系统,数据库是Oracle 11.2.0.3.0,为了提高速度,存储了两个汇总表,一个12万行,一个一百多万行。

4.2内存计算和消除冗余带来的优势

得益于本文上面描述的列式存储方式,内存速度的提升,可以重新设计一个没有冗余的系统,把所有的表属性都归入一个统一表里,一个表含有所有表的字段,不再有其他单独的物化表。

在以前磁盘数据库和行式存储没有大量压缩的情况下是无法实现的,但列式存储和内存计算下可以实现,而且还有很多好处。

以往解决用户问题围绕着物理化存储的表,或者依赖低效的实时计算。如果基于没有冗余和内存计算的高速度,几乎可以解决任何用户问题,非常适合高性能要求的应用,比如大数据分析、交互实时要求高的在线交易系统等。

5 结语

随着技术的进步,移动互联网应用的飞速发展,各种数据应用变得越来越广泛和深入,对数据的响应速度要求越来越高,尤其以大数据为基础的应用为甚。内存计算是解决读写性能的重要手段,技术的革新取决于人类生产与生存的需求,如果需求持续,得益于硬件技术的飞速发展,内存越来越便宜,加上列式存储技术和压缩技术的应用,内存数据库技术将会得到蓬勃发展。

参考文献:

[1] Jens Krueger. Fast Updates on Read-Optimized Databases Using Multi-Core CPUs,2011.

[2] Edgar Codd. A Relational Model of Data for Large Shared Data Banks. Communication of the Association for Computing Machinery,1970.

[3]Edgar Codd. Further Normalization of the Data Base Relational Model.IBM Research Report Rj909,1971.