12月15日,IBM软件工程师冯媛老师,在DBA 社群DB2用户群进行了一次主题为“DB2 BLU加速器功能简介”的线上分享。小编特别整理出其中精华内容,供大家学习交流。同时,也非常感谢冯媛老师对DBA 社群给予的大力支持。 冯媛:
IBM在DB2 10.5版本中推出了BLU Accelerator,IBM对于列存储的支持晚于TeraData,Sybase等数据库厂商。BLU Acceleration作为IBM全球数百位顶尖研究人员智慧结晶,BLU具有内存列式动态处理、可操作的压缩数据、并行向量处理、以及数据忽略等行业独有的特性。今天我这里和大家一起分享一下DB2做的这些优化。 列存储最大的特点是数据是按列存储的,比较适合OLAP应用中获取一部分列的场景。 在行存储的时候,数据页里存有整行的数据,当我们需要查询局部列的时候,必然的我们会把对应的行所在的页都加载进来,想象一下数据库在读的时候我们都知道bufferpool会顺序预取后面的几页,对于一个有很多行的表,取局部列数据的时候实际上会带来非常多的额外IO开销。举个比较极端的场景100列的表中取1列的情况,如果没有索引在这一列上,IO中只有1%的数据才是我们需要的。 那么既然BLU的数据都是以单列存储的,又怎么能保证对于数据多列的读取的呢。 DB2将一组列组成的单元给了一个唯一的序列号叫TSN, 由TSNList组成了一个逻辑的行。每个页有一个TSN map。所以行表里的RID()这些方法在列表里是不支持的。对于取局部列数据的应用,比如之前100列中读取1列,这里只要把列所在的数据页加载过来就行,不需要加在其他无关列的数据。 DB2在BLU的压缩中不仅有列级别的压缩,而且在页级别的字典会再进一步压缩。 当数据被Load的时候,当你使用LOAD REPLACE, LOAD REPLACE RESETDICTIONARY, LOAD REPLACE RESETDICTIONARYONLY或者LOAD INSERT的时候,列级别的压缩字典就会被创建。当新的数据被加入的时候,数据会用表级别的压缩字典进行压缩。BLU还会用页级别的压缩字典来压缩新的时候。这种两层的数据压缩字典,提高了数据的压缩效率。页级别的压缩字典就存在于每个数据页中。每个数据页包含了该页的起始TSN以及总共有多少个TSN。 BLU采用了压缩包括了近似的霍夫曼编码、前缀编码和差值压缩。对于出现频率高的值压缩后会用比较少的bit来表示,而且在一个区块内是保序的。结合页级别的压缩,有可能根据列级别的压缩成为3 bits的,在当前页里面出现频率比较高有可能就会压缩成2 bits. 这种压缩算法大大提高了压缩效率,减少了存储和I/O开销。数据页里保存了当前页的压缩字典。 在进行查询的时候,查询条件的值也是通过压缩算法后在每个单元中比较的,而不是把数据解压后进行比较,只有满足条件的值才会被过滤出来,在中间运算过程中尽可能的用压缩值。 DB2自动维护了一个page map index和一个Synopsis表,page map index存放了列组合的起始TSN以及对应的页地址。Synopsis表含的是每个非字母列的最大,最小值组合。 在数据Load和insert的时候,DB2会自动在Synopsis表中生成记录,Synopsis表里包含了MinTSN、MaxTSN以及列的最大和最小值。 Synopsis表能帮助在查询的时候根据查询条件跳过一些TSN。在Load的时候每1024TSN就会插入一条记录在概要表里,每一次插入事务也会单独生成一条记录。DB2 BLU比较适合大批量的数据插入,比如Load、ingest等,不适合单个insert操作,性能相对会慢一些。 我们在刚才看概要表的时候,已经讲到概要表里的最大,最小值能帮助在查询的时候跳过不需要的数据。 比如列之间的谓词条件的查询: x1 |
|
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系
[邮箱地址] 删除
|