1.3.2 Oracle Database In-Memory

2014年6月10日,Oracle CEO拉里·埃里森在总部宣布了一项突破性的创新技术:Oracle Database In-Memory。和Multitenant一样,Database In-Memory是12c版本数据库中一个全新选件,是继Exadata之后最重要的数据库创新之一。在第三方研究机构Forrester于2017年第一季度发布的报告中(2),Database In-Memory和Oracle TimesTen一起被归类为内存数据库的范畴,并在市场和产品战略方面均处于首位。

在架构层面,Database In-Memory可以在数据仓库,或在混合负载的源OLTP系统上直接启用。在源端直接启用Database In-Memory,可避免额外再搭建一套ODS系统,减少或免除ETL任务。同时由于Database In-Memory无须建立专门的分析型索引,还会带来简化管理和交易性能提升等好处。临时性的数据使用并不能从Database In-Memory中受益,如ETL中的暂存区域。但由于可以直接从内存中读取数据以及避免了更新分析型索引的开销,数据抽取和加载的速度仍可以得到提升。Oracle提供In-Memory建议器,可以通过分析现有数据库的工作负载,判断其是否可以从Database In-Memory中受益,哪些表适合于发布到内存列式存储中,同时获取其大致的压缩比和性能提升倍数。

传统的数据库以行的方式存放数据,例如Oracle数据库的磁盘存储和内存缓存。行式存储比较适合在线事务处理类应用,因为应用可以快速访问一行记录中的多列。而数据分析类应用则不同,它往往只需要访问部分列中的大量数据,因此相应产生了使用列式存储的数据库,如KDB、Sybase IQ、Vertica等。列式数据库非常适合统计分析和数据挖掘类应用,但是当数据发生修改时会引发很大的开销。

Database In-Memory采用了独特的行列双格式存储,结合了两种格式的优点。应用访问数据库时,查询优化器会根据工作负载特征自动选择行式或列式存储,所有这一切对于应用是透明的,应用代码无须改变。事务日志处理、数据持久化仍由传统的行式存储处理,列式存储则可以专注于加速内存中数据的扫描和过滤。通过更新日志、后台刷新和实时合并机制,从列式存储中数据查询的数据可以始终保持最新,并提供事务一致性。

不同于TimesTen和SAP HANA需要将所有数据加载到内存中,Database In-Memory可以选择加载部分表、表的部分分区或表的部分列,因此提供更大的灵活性。可以通过优先级调整表加载的顺序,如指定在数据库启动时加载,或是在实际访问时即时加载。Database In-Memory支持多种压缩算法,如字典压缩、RLE压缩和ZIP压缩。由于列中的取值重复度相对较高,并且可能存在空值,因此通常可以达到2~20倍的压缩比,实际对总内存的增长通常只在20%左右。如果需要准确的内存需求估算,Database In-Memory提供压缩建议器,可以对不同压缩级下的压缩比进行评估。

Database In-Memory的另一个优势在于与Oracle数据库企业版功能和选件的集成,这意味着其可以通过RAC实现高可用和横向扩展,结合ADG实现灾备和生产端负载转移,以及通过分区实现数据生命周期管理和分区优化的联结和并行处理。

内存计算技术绝不仅仅是将数据放入内存中,从图1-4所示的Database In-Memory的整个发展历程中就可以看出这一点。在12.1.0.2版本的首次发布中,纯内存列式格式、In-Memory压缩、存储索引和SIMD向量处理构成了Database In-Memory最核心和最基本的功能,同时也是即使将所有数据置入行式的内存缓存中,内存列式存储也会更快的根本原因。在这4项基本功能中,前3项均为软件实现,SIMD向量处理是软件和硬件指令集的结合。In-Memory联结和In-Memory聚合均为优化器的改进,基于布隆过滤器和Key Vector数据结构。

图1-4 Database In-Memory功能特性演进

2017年3月1日,Oracle数据库12.2.0.1版本正式发布。在性能方面,Database In-Memory推出了In-Memory Expression、In-Memory JSON和In-Memory联结组三项新功能。In-Memory Expression可以将用户定义的表达式虚拟列,或由优化器自动捕获到的频繁执行的表达式物化到内存(IMEU)中,通过避免重复计算提高查询效率。In-Memory JSON使用Oracle优化的二进制OSON格式存放JSON数据,从而可以与SIMD向量计算结合,实现性能提升。In-Memory联结组为两个表的联结列共享了相同的字典,从而避免了解压带来的额外开销。在容量方面,Database In-Memory支持Active Data Guard和Exadata,使内存计算延伸到灾备端和超大容量的Exadata Flash Cache。Exadata本身支持混合列压缩,Database In-Memory使Exadata支持新的纯列式格式,超大的表可以将不同分区分布在内存和闪存中,但同一个段对象不能在两者间分布。在可用性方面,FastStart可将内存中的数据定期刷新到磁盘中,这样就省去了发布数据时进行列式转换和压缩的开销,加快了发布速度。在易管理性方面,Database In-Memory支持与自动数据优化(ADO)策略结合,实现对内存对象的生命周期管理。ADO根据热图信息,自动将对象加载到内存或从内存中清除,或者调高对象的压缩级以节省空间。

2018年2月16日,Oracle正式发布了数据库18c版本,18c是Oracle数据库首个按年度发布的版本。Database In-Memory在此版本中的增强主要体现在性能、大数据和自动化管理三方面。分析型任务会大量使用数学计算,Oracle的NUMBER类型是用软件实现的,而且宽度不一。In-Memory Optimized Arithmetic使用优化的紧凑等宽格式存储NUMBER类型数据,使得数学计算可以利用SIMD指令加速。In-Memory动态扫描可以利用空闲的CPU资源,自动启动轻量级的线程进行并行扫描以提升性能,并且不会对其他任务造成影响。In-Memory动态扫描与Oracle已有的并行执行机制并不冲突,两者是互补关系。Oracle 18c是Database In-Memory支持外部表的首个版本,这使得用户的数据领域延伸到Oracle数据库之外。通过将外部表发布到内存,可以避免对外部存储的访问,提升分析性能,同时可以充分利用到Oracle数据库的安全性和丰富的SQL能力。在12.2版本自动数据优化支持的基础上,Automatic In-Memory将内存自动化管理又向前推进了一步。在内存紧张导致对象无法完整发布时,Automatic In-Memory会将最不活跃的对象从内存中驱逐,为需要发布的对象留出空间,所有这些都是自动完成的。

2019年2月13日,数据库19c版本率先在Exadata上得到支持。在此版本中,Database In-Memory对之前部分特性做了增强。例如In-Memory动态扫描无须手动启用资源计划即可自动运行,可通过POPULATE_WAIT PL/SQL函数支持前台发布,这样应用可以等到对象完全发布后再启动,带给用户良好的使用体验。在大数据方面,新增对Hive和HDFS两类外部数据的支持,并支持对外部表的并行查询。

2021年1月13日,Oracle在其公有云上率先发布了21c版本。在易管理性方面,自治In-Memory在自动In-Memory基础上更进一步,可实现数据库对象的完全自动化管理。在大数据方面,Database In-Memory增加了分区外部表和混合分区表的支持,以及全文本列、原生JSON列和空间数据的支持。性能方面新增了对向量化联结与混合扫描的支持。最后,Base Level特性允许用户无须许可即可使用最多16GB内存列式存储,此特性可以让更多用户体验Database In-Memory的功能和好处。