Oracle Database In-Memory(架构与实践)
上QQ阅读APP看书,第一时间看更新

1.1.2 软件的发展

在硬件发展的同时,一些软件技术的普及也促进了内存计算技术的发展,其中主要的技术为列式存储或行列双格式存储、内存压缩、分区等技术。

传统关系型数据库主要面向在线事务处理应用,这些应用需要在频繁的小规模更新时仍可以保证很好的性能,因此行式存储成为主流的记录组织格式。而对于在线分析处理和数据挖掘类查询密集型应用,访问模式完全不同,这类应用通常只访问记录中少量属性,通过对大量数据进行计算后得到汇总结果集。如果使用行式存储组织数据,即使只访问少数几列,也需要读取记录中的所有数据,大量的I/O只能产生少量有效数据。因此对于在线分析处理类应用,产生了两种应对的方法,即预计算和垂直分区方法。预计算方法将预先计算的结果存放于立方体或物化视图中,这种方法可以对汇总的结果进行切片、下钻和上卷等操作。但这种方法的缺点在于只能加速模式已知的查询,而对灵活的即席查询并不适用,另外,还需要考虑事实表和预计算结果集之间的同步问题。而垂直分区则是将数据按列组织,由于需要查询的属性值集中存放在连续的数据块中,因此对于合计、分组、排序、映射等操作,通过较少的访问即可获取更多的有效数据,这极大提高了数据分析类应用的效率。列式存储提高了I/O效率,通过将列式存储完全加载到内存则进一步避免了磁盘I/O访问,并且可以充分发挥多处理器多核的并行处理优势,对于即席查询也可以获得很好的性能。内存中列式存储还可以结合单指令多数据(SIMD)CPU指令进行高效扫描,利用布隆过滤器(Bloom filter)进行高效表联结操作。

最初的内存列式数据库仅适用于数据分析类应用,一些新型的内存数据库通过同时支持事务类应用增加了数据库的普适性,如Oracle Database In-Memory和SAP HANA,这些数据库通过同时支持行列双格式实现对不同特征数据操作的统一支持,同时通过后台任务保持两种格式间数据的一致性。

与列式存储经常结合的一个软件特性是压缩,由于列属性值集中存放,并且由于分析的列取值通常重复度较高,或者大量的取值为空,因此压缩的效率非常高。压缩不仅可以节省昂贵的内存空间,同时也可以提升性能。内存中压缩减少了CPU和内存间数据的移动,并且由于在等量空间中存储或缓存了更多的数据,因此可以提高数据处理的吞吐量和缓存命中率。内存数据库最常使用的压缩算法为字典压缩,这是一种轻量级的无损压缩。字典压缩可以将源数据转换为等宽的值,这非常适合于结合SIMD实现批量和并行处理,同时也支持无须解压直接在压缩格式数据上进行操作。也可以选择叠加压缩算法或选择压缩比更高的算法,如RLE游程编码或ZIP算法,但需要在空间节省和处理开销间进行平衡。