Oracle 发布了关于 Exadata 的混合列压缩(Hybrid Columnar Compression)功能的白皮书(refer)。到现在这方面中文资料还比较少,所以分享一下我读这篇白皮书的笔记。Oracle 在这个文档中也提出了 数据仓库压缩(Warehouse Compression)与归档压缩(Archive Compression)两个概念上的”新”功能。
我们知道 Oracle 数据库引擎默认是以数据块(block)为存储单位,以数据行(row)作为存储与组织方式,当然理想情况是在一个数据块内存储更多的数据行,而实际上这样的方式对于一些列数较多的表不可避免的会带来存储空间的浪费。相反,以列(columnar)的方式组织、存储数据在空间上会带来很好的收益,但是对于依赖于行的查询,也是我们最常用的查询方式,则性能会差很多,而对于数据分析方面常见的汇总之类的查询,因为只需要扫描较少的数据块,就会达到很好的性能。可实际环境中,人们往往要熊掌与鱼兼得,为了达到空间和性能上的折衷,Oracle 引入了新的方式:用行与列混合的方式来存储数据。
如上面的示意图,从高一层抽象上看,引入了一个新的叫做压缩单元(compression unit,cu)的结构用于存储混合列压缩的行的集合。新的数据载入后,列值追加到旧有的行集合的后面,然后进行排序与分组等操作后进行压缩。这一系列动作完成后,组成一个压缩单元。直接一点说,也就是对列存储做分段处理,而压缩单元用来维系不同分段之间的关系。有个特别之处是,要使用批量装载(Bulk Loading)的方式,对于已经存储的数据依然可以应用 DML 操作。而 Exadata 引擎对待已经存入的数据的策略是按需进行解压缩。
这是与传统的 Oracle 数据库引擎所说的压缩截然不同的方式。至于数据仓库压缩与归档压缩的功能,看起来只是针对不同的场景而设置了不同的压缩密度而已。而 Oracle 之所以强调 Exadata 的压缩能力,我想更多是因为 Exadata 目前对于存储能力和价格上的限制吧。
–EOF–
混合列压缩是Exadata V2推出的。与之前V1强调极致的数据仓库性能不同,V2特别强调对于OLTP的极致性能。而OLTP是IO密集型的,IOPS就是很重要的一项指标。有了混合列压缩后,就极大减少了在存储和数据库服务期间所需要的带宽,因此可以获得很高的IOPS提升。
而且V2中的smart scan也支持压缩后的数据处理,加上partition、infiniband、storage index……效果很震撼的。
小弟之前也一直关注Exadata,上面是一点我的愚见。
楼上的兄弟被文档搞混了吧。
V2之所以强调OLTP其主要原因是flash cache的出现,极大提高了IOPS。
事实上,混合列压缩对OLTP来说不是完全合适的,比如一个小小的insert,就需要把列级压缩转成行级压缩后再放入新值。
正如你所说的,OLTP是IO密集型,但不是查询密集型,不像数据仓库应用查询操作居多,所以天然的喜欢混合列压缩。
Exadata 其实就是将运算分散,同时利用cache将IO压力分散,这其实就是一种trade-off,集成专属的应用,当然也必须付出代价