几种主流数据库的压缩技术对比 - Swimming Fish

时间:2024-03-08 14:07:27

几种主流数据库的压缩技术对比

原文链接:http://blog.inkernel.info/archives/1.html


      压缩功能几乎是当前主流数据库的标配功能,除了能够节省存储空间外,在IO密集型的系统中, 可能也会带来性能的提升。由于我们的存储引擎也需要做记录级压缩的功能,所以很长的一段时间都在研究数据库压缩的技术,包括算法的选型及优化,当然这之前要对现有主流数据库的压缩功能做一些调研。 资料的来源比较分散,有手册,论文,也有其他的网络资料, 所以也未一一标出出处,如有疑问,欢迎提出

DB2中行级压缩的特性

  1. 在DB2中引入了一种叫Venom的技术,是基于字典的压缩方法。其中字典存储在一个内部数据结构中,并缓存起来以提高查询的速度(Thedictionary for compression/decompression lookup is stored in hiddenobjects in the database, occupies little space, and is cached in memoryfor quick access)。
  2. DB2会有算法检测如果对记录进行压缩是否会带来空间的节约,如果不节约就不进行压缩,估计是对部分数据进行采样获得(When compressinga large table, it may be useful to populate the table with a small setof "representative" or sample datafirst.)。对于新加入的记录,还是继续沿用老的采样获得的字典,但是提供REORG命令供重组字典并重新压缩。
  3. DB2采用的是不同于Oracle的全局字典,而不是页内建字典(By building a compression dictionaryat the table rather than page level, patterns across the entire tableare analyzed, generally resulting in improved disk savings with DB2.)
  4. DB2中缓存在Buffer中的数据也是压缩格式的(Furthermore, DB2 keeps the data compressed onboth disk and memory (DB2 buffer pools), thereby reducing the amount ofmemory consumed, and freeing it up for other database or systemoperations.),这样实现即使每次从内存中读取记录都要解压缩一次。
  5. 写入日志的记录数据也进行了压缩(Thesize of database logs can also be reduced since DB2 compresses userdata within logrecords.)。

Oracle 11g中行级压缩的特性:

  1. Oracle 11g引入的行级压缩是发生在数据块内的,每一个数据块内建有一个symbol表,相当于压缩字典。 在缓存中数据是以压缩形式存在,这跟DB2是类似的, 可以增加缓存命中率, 减少IO从而提高性能。
  2. 发生更新,插入,删除操作的时候,通过一个阀值控制是否进行压缩。
  3. 使用ALTER TABLE在线更改表模式指定压缩时只对后面新插入的记录生效,原有记录不会被压缩(You can alter thecompression attribute for a table (or a partition or tablespace), andthe change only applies to new data going into thattable)。但是可以通过命令把原纪录也变成压缩格式(Existing data in the database can also becompressed by moving it into compressed form through ALTER TABLE andMOVE statements.)。
  4. 对读操作没有性能影响,但是对写操作应该有一些影响,Oracle通过批处理解决(Oracle compresses blocks in batch mode rather than compressing dataevery time a write operation takesplace.),即当新初始化的块中插入的记录达到一定阀值后才进行压缩,继续往这一个块中插入记录,那么都会进行重新压缩以达到更高的压缩比,这一步骤会重复直到检测到再进行重新压缩已经没什么好处了才会不再进行。
  5. Oracle的段内压缩比较适合用于更新比较少的应用,更适合OLAP而不适合OLTP,频繁地更新可能会带来比不压缩更多的空间浪费,因为频繁地更新可能会导致记录的迁移。

falcon中压缩的特性:

  1. 如果某一列设了默认值,则不会在列中存储默认值。
  2. buffer中缓存的是非压缩的完整记录;
  3. 记录压缩,准确地说应该是编码,是采用一种密集的自描述结构,Nulls, zero length strings, and numbers -10 to 31只用一个字节表示;其他整型,取决于大小,可能需要1-8位的类型描述,所有的整型统一编码;
  4. using only as many bytes for integer as it requires, not storing column value if it is default

      关于falcon中的数据压缩包括官方文档在内的资料中介绍得很少,事实上其功能应该相对比较简单,压缩比也不大,Jim Starkey本人称其为\'encoding\',而不是\'compression\'。

SQL Server 2008压缩特性

SQL Server似乎是2008之后才引入的压缩的功能,是采用行级压缩和页级压缩相结合的方法。其中行级压缩主要针对整型以及char类型。
  1. 将对所有数据类型的 NULL 和 0 值进行优化,从而使它们不占用任何字节。
  2. 减少了与记录相关联的元数据开销。此元数据为有关列、列长度和偏移量的信息。在某些情况下,元数据开销可能大于旧的存储格式。
  3. 对于数值类型(例如,integer、decimal 和 float)和基于数值的类型(例如,datetime 和 money)使用可变长度存储格式。
  4. 通过使用不存储空字符的可变长度格式来存储定长字符串(删除尾随字符串)。
  5. 页级压缩是先采用前缀压缩,再采用字典压缩;在页中添加新纪录时不会马上进行页压缩,只有当页满且有新记录插入时才进行页压缩;
  6. 数据不是以固定大小的字节进行存储,而是用最小所需的字节,只需要启用行压缩功能就可以执行。但是,行压缩无法处理XML、BLOB和MAX数据类型;