压缩功能几乎是当前主流数据库的标配功能,除了能够节省存储空间外,在IO密集型的系统中, 可能也会带来性能的提升。由于我们的存储引擎也需要做记录级压缩的功能,所以很长的一段时间都在研究数据库压缩的技术,包括算法的选型及优化,当然这之前要对现有主流数据库的压缩功能做一些调研。 资料的来源比较分散,有手册,论文,也有其他的网络资料, 所以也未一一标出出处,如有疑问,欢迎提出。
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数据类型;
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】
微信公众号
![TechTarget微信公众号二维码](/wp-content/uploads/res/images/spriteimg/ttweixin.jpg)
TechTarget
官方微博
![TechTarget中国官方微博二维码](/wp-content/uploads/res/images/spriteimg/ttweibo.jpg)
TechTarget中国
作者
相关推荐
-
OpenWorld18大会:Ellison宣布数据库的搜寻和破坏任务
在旧金山举行的甲骨文OpenWorld 2018大会中,甲骨文首席技术官(CTO)兼创始人Larry Elli […]
-
ObjectRocket着力发展Azure MongoDB服务
MongoDB吸引了微软公司的注意力,微软公司计划针对运行于该公司2017年发布的Azure Cosmos D […]
-
数据库和数据仓库的区别在哪儿?
目前,大部分数据仓库还是用数据库进行管理。数据库是整个数据仓库环境的核心,是数据存放的地方和提供对数据检索的支持。
-
如何使用服务来平衡Oracle RAC 数据库工作负载
为不同的应用程序配置不同的服务,DBA可以更有效地平衡集群工作负载,在Oracle RAC数据库环境下实现更好的应用程序性能。