LanDom
作者LanDom·2010-05-05 10:37
软件开发工程师·互联网企业

DB2 V9.7 索引压缩原理

字数 4900阅读 3347评论 0赞 0
本文内容包括:
 DB2 V9.7 压缩增强介绍
 索引压缩介绍
 索引压缩特性
 应用场景
 总结
 参考资料 
 关于作者
 对本文的评价

级别: 初级

孔再华, 软件工程师, IBM

2009 年 11 月 26 日

DB2 V9.7 具有很多新的特性和改进。其中增强的压缩功能包括索引压缩,大对象压缩,临时表压缩等等。本文主要详细介绍 DB2 V9.7 索引压缩的原理,帮助读者了解索引压缩究竟在做什么,以及相应的了解在什么样的情况下采用索引压缩更有意义。

DB2 V9.7 压缩增强介绍

DB2 V9 的深度压缩功能已经成功地帮助了很多 DB2 客户降低运营成本,提高查询效率。越来越多的客户认识到深度压缩的好处。DB2 在新的版本 V9.7 中发布了很多压缩增强功能。首先让我们来了解一下 DB2 压缩功能的发展。DB2 V9 之前的版本具有空值压缩和默认值压缩这两种压缩功能。DB2 从 V9 开始发布了行压缩,也就是我们常说的深度压缩。DB2 V9.7 中又新增加了索引压缩,XML 压缩,大对象压缩,临时表压缩等功能。DB2 正采用越来越多新的压缩技术来帮助用户节省成本,提高效率。





回页首


索引压缩介绍

越来越多的客户正为面临着日益增长的存储成本而烦恼。应用的增多,数据的堆积,带来的不仅仅是存储空间的开销,还有性能问题。DB2 V9 发布的行压缩技术通过压缩表中数据,能够很显著的减少一些表的大小,提高 IO 效率,并且在很多的客户中取得了很大的成功。对于用户的数据库大小,表的数据大小是其中的一部分,而索引也有着非常重要的影响。在很多数据库系统中,为非常大的表创建出的非常大的索引是很常见的事情。尤其在一些 BI 系统中,表的数据量很大,为了增加查询速度,会为不同的查询创建很多索引。这些索引的大小也是非常可观的。DB2 认识到这一点,在 V9.7 中提供了索引压缩功能,可以通过压缩索引来减少存储开销。

索引压缩机制与行深度压缩机制相比没有压缩字典,采用的是完全不同的压缩算法。事实上索引压缩功能启用后,DB2 会采用多种算法来自动压缩索引。DB2 V9.7 采用了三种压缩原理:
Slot directory 压缩(Slot directory compression),
记录标识列表压缩(RID list compression)和
索引键前缀压缩(Prefix key compression)。

 

原先的索引存储结构

在了解索引压缩的原理之前,我们先了解一下索引是如何存储在数据库中的。


图 1. 原先的索引页
 

图 1 显示索引页结构。索引的存储和表数据的存储差不多,也是存放在预先定义了大小的数据页中。

  • 页头。每个索引页都是从页头开始,跟着是 SLOT 目录。
  • SLOT 目录。在 SLOT 目录中,每两个字节对应此索引页中不同的索引键。标识不同索引键在页面中的起始位置。
  • 索引键和记录标识列表。索引在表上定义时,选择创建索引的表列的子集就是索引键。每个索引项还包含相应记录的逻辑指针(RID),也就是记录标识,指到数据表中数据行的位置。

了解了索引的存储结构,我们可以先想象一下,在索引页中有哪些部分是可以被压缩变小的?压缩之后,同样大小的索引页中能否放入更多的数据?在使用索引时,需要什么样的步骤才能达到原先的效果?

Slot directory 压缩算法

在 DB2 之前的版本中,Slot directory 是基于最小索引键的大小预先分配和固定的。这样做可以保证 Slot directory 在任何情况下都能覆盖页中任何索引键可能放置的区域。我们想象一个索引页中能够放置最多索引页的情况是:索引键的大小都是最小值,索引键的唯一的,只对应一个 RID。这样放置的索引键的条目最多,也就是需要的 Slot 最多。Slot directory 预先占用的大小也是这么算出来的。

但是,如果某个索引键对应多个 RID,又或者某个索引键大于最小值,那么它们显然都大于一个索引键最小值加上一个 RID。条目变长了,索引页中放置的索引键数目要小于原先的预设值。也就是说有一些预先占用的 Slot 没有使用到。而 DB2 V9.7 之前的版本中 Slot directory 是固定的,那么那些没有使用的 Slot 就浪费了。在 DB2 V9.7 中,Slot directory 不再是固定的,而是根据实际页面中存储的索引键相应调整的。这也就意味着在索引页中,任何一个字节都没有被浪费。在同样的情景下,省略出的 Slot 空间可以放置更多的数据。


图 2. Slot directory 压缩后的索引页
 

图 2 显示在采用了 Slot directory 压缩后,索引页中省下的空间。

记录标识列表压缩算法

在图 1 中已经说明了一条索引是由索引键和对应的记录标识列表组成的。记录标识列表是此键值对应的一些 Record ID(RID)。RID 标识记录在表中的位置。一般由 4 到 8 个字节组成。假设在索引页中,某个索引键对应的 RID 列表是‘ 00,00,00,06 ’‘ 00,00,00,07 ’,它标出了对应的两行记录在表中的位置。其实这是两条相邻的记录,第二条记录与第一条记录的增量是 1. 在 DB2 V9.7 中,索引可以存储相邻记录间增量 1 来替换‘ 00,00,00,07 ’这个 RID。转换后存储为‘ 00,00,00,06 ’‘ 1 ’。与原先的标识相比,几乎减少了一半的空间。如果对图 1 中的索引进行 RID list 压缩,就会得图 3 所示结果 .


图 3. RID list 压缩后的索引页
 

与图 1 相比,记录标识列表中存储的数据发生了很大的变化,除了第一条 RID 是存储的完全记录外,其他的都是存储的记录之间的增量。这个增量可以小到甚至只有 1 字节,与原先需要 4 到 8 个字节的 RID 来标识记录相比,压缩程度是非常可观的。

索引键前缀压缩算法

这种压缩算法与行压缩有一定的相似,但又有很大的不同。因为索引键是存储在索引中的,对于存储在同一页中的索引键,很有可能相邻的索引键的值差别不大。比如部门编号的前几个数字都是相同的,只有最后两位用了不同的代码区分,比如中国员工的姓名,同姓的人很多,区别是名字不一样。这些信息被存储在表中,并被拿来创建索引。在创建索引或者插入索引时,DB2 会对比相邻的索引键的值,获得其中最长的前缀值。当索引页存满后,这些前缀值又会与相邻的前缀值比较得到优化的前缀值。这些优化的前缀值会被提取出来,存放到 Slot directory 之后。


图 4. 索引键前缀选取
 

图 5. 索引键前缀压缩
 

在图中所显示的案例中,DB2 分别挑选了‘ IBM,CN ’和‘ HP,EN,Zha ’作为可压缩的前缀值,存放在 Slot directory 后,然后用‘ 0,2 ’标记提取位置。与行压缩相比,这些前缀的用法与数据字典用法相似,但是前缀只应用于当前索引页中,而数据字典应用于整张表。





回页首


索引压缩特性

对于上述的三种压缩算法,DB2 在索引压缩启用后,会根据数据的排放,自动选择最好的压缩算法对索引进行压缩以达到存储的最小化。用户不需要指定使用哪种算法。索引压缩只压缩索引树中处于叶子节点的索引页。对叶子节点的索引页进行压缩,可以减少页分叉,降低索引层次。压缩直观图如图 6 所示。


图 6. 索引压缩
 

索引压缩使得索引页中可以放入更多的记录,也就意味着对索引的操作过程中,读入缓冲池的索引页中包含更多记录,缓冲池就能放入更多的记录,提高了缓冲池的命中率,因此提高了 IO 的使用效率。压缩使得索引树的层次变小,也就是说当索引从根目录进行搜索时需要的 IO 也会减少,同样也会提高 IO 效率。另一方面,索引压缩和行压缩一样,需要额外的 CPU 来压缩和解压索引,对于 CPU 资源缺乏的系统,需要慎重考虑是否启用索引压缩。





回页首


应用场景

了解了索引压缩的三种算法,那么什么样的索引适合进行压缩呢?也就是如何选择索引压缩的应用场景。对于 Slot directory 压缩算法,通常 Slot 占用的空间是页中很小的一部分,在选择应用场景的因素中占用比率会比较少。所以选择适合压缩的索引,最主要是基于另外两种算法的考虑。对于记录标识列表压缩算法,很显然如果同一索引页中索引键的重复数越多,也就是同一索引键对应的记录标识列表越长,压缩程度越高。这就意味着两个方面的要求,一方面是选取的表的列用来创建索引的重复度要高,压缩才有意义,另一方面是要求索引聚合度要高,这样才会使得索引键的更多记录存储与同一页中,因为索引压缩是以页为基本操作单元的。对于前缀键的压缩,很显然相关的因素也是索引键的选取。选择的索引键相似度越高,压缩越有效。针对上述情况,相信读者在选择压缩的索引时会有更好的洞察力。





回页首


总结

本文主要介绍了 DB2 索引压缩特性。希望通过本文读者能够了解 DB2 压缩索引的原理,了解如何选择压缩对象以取得很好的压缩效果,节省存储成本并提高数据库系统的整体性能。关于实现索引压缩的具体步骤和方法,可以参考 developerworks 上的文章,或者搜索 DB2 V9.7 信息中心 获得更多相关信息。



参考资料

学习

获得产品和技术
  • 使用可直接从 developerWorks 下载的 IBM 产品评估试用软件 构建您的下一个开发项目。

  • 现在可以免费使用 DB2。下载 DB2 Express-C,这是为社区提供的 DB2 Express Edition 的免费版本,它提供了与 DB2 Express Edition 相同的核心数据特性,为构建和部署应用程序奠定了坚实的基础。


讨论


关于作者

孔再华,IBM SAP Integration and Support Center 的成员。目前的工作包括利用 DB2 for Linux, UNIX, and Windows 的每个新版本测试和认证 SAP R/3,以及帮助客户在 DB2 环境中运行 SAP,帮助他们分析问题和进行故障检修。

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

0

添加新评论0 条评论

Ctrl+Enter 发表

作者其他文章

  • DB2 调优指南
    评论 0 · 赞 0
  • 验证DB2安装是否已经成功?
    评论 0 · 赞 0
  • DB2 表
    评论 0 · 赞 0
  • AIX下DB2 安装
    评论 0 · 赞 0
  • 1. 环境变量
    评论 0 · 赞 0
  • 相关文章

    相关问题

    X社区推广