几种主流数据库的压缩技术对比
时间:2010-10-15 来源:Ricky Lee
DB2中行级压缩的特性
- 在DB2中引入了一种叫Venom的技术,是基于字典的压缩方法。其中字典存储在一个内部数据结构中,并缓存起来以提高查询的速度(Thedictionary for compression/decompression lookup is stored in hiddenobjects in the database, occupies little space, and is cached in memoryfor quick access)。
- DB2会有算法检测如果对记录进行压缩是否会带来空间的节约,如果不节约就不进行压缩,估计是对部分数据进行采样获得(When compressinga large table, it may be useful to populate the table with a small setof "representative" or sample datafirst.)。对于新加入的记录,还是继续沿用老的采样获得的字典,但是提供REORG命令供重组字典并重新压缩。
- 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.)
- 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.),这样实现即使每次从内存中读取记录都要解压缩一次。
- 写入日志的记录数据也进行了压缩(Thesize of database logs can also be reduced since DB2 compresses userdata within logrecords.)。似乎Oracle中没有提到,对于块内压缩来说对日志的记录的压缩不是那么容易实现,但DB2的基于表级字典的压缩则相对容易些,假设像MySQL那样slave只是通过日志来回放,那块内压缩的的做法就无法满足这个要求。
Oracle 11g中行级压缩的特性:
- Oracle 11g引入的行级压缩是发生在数据块内的,每一个数据块内建有一个symbol表,相当于压缩字典。 在缓存中数据是以压缩形式存在,这跟DB2是类似的, 可以增加缓存命中率, 减少IO从而提高性能。
- 发生更新,插入,删除操作的时候,通过一个阀值控制是否进行压缩。
- 使用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.)。
- 对读操作没有性能影响,但是对写操作应该有一些影响,Oracle通过批处理解决(Oracle compresses blocks in batch mode rather than compressing dataevery time a write operation takesplace.),即当新初始化的块中插入的记录达到一定阀值后才进行压缩,继续往这一个块中插入记录,那么都会进行重新压缩以达到更高的压缩比,这一步骤会重复直到检测到再进行重新压缩已经没什么好处了才会不再进行。
- Oracle的段内压缩比较适合用于更新比较少的应用,更适合OLAP而不适合OLTP,频繁地更新可能会带来比不压缩更多的空间浪费,因为频繁地更新可能会导致记录的迁移。
falcon中压缩的特性:
- 如果某一列设了默认值,则不会在列中存储默认值。
- buffer中缓存的是非压缩的完整记录;
- 记录压缩,准确地说应该是编码,是采用一种密集的自描述结构,Nulls, zero length strings, and numbers -10 to 31只用一个字节表示;其他整型,取决于大小,可能需要1-8位的类型描述,所有的整型统一编码;
- 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类型。- 将对所有数据类型的 NULL 和 0 值进行优化,从而使它们不占用任何字节。
- 减少了与记录相关联的元数据开销。此元数据为有关列、列长度和偏移量的信息。在某些情况下,元数据开销可能大于旧的存储格式。
- 对于数值类型(例如,integer、decimal 和 float)和基于数值的类型(例如,datetime 和 money)使用可变长度存储格式。
- 通过使用不存储空字符的可变长度格式来存储定长字符串(删除尾随字符串)。
- 页级压缩是先采用前缀压缩,再采用字典压缩;在页中添加新纪录时不会马上进行页压缩,只有当页满且有新记录插入时才进行页压缩;
- 数据不是以固定大小的字节进行存储,而是用最小所需的字节,只需要启用行压缩功能就可以执行。但是,行压缩无法处理XML、BLOB和MAX数据类型;
相关阅读 更多 +