DB2 V9.7 for Linux, UNIX, and Windows

索引的类型

您可以创建不同类型的索引以便用于不同的用途。例如,唯一索引将对索引键强制实施唯一性约束;双向索引允许按正向和反向进行扫描;集群索引有助于提高按键顺序遍历表的查询的性能。

唯一索引和非唯一索引

唯一索引是这样一种索引,它通过确保表中没有两个数据行具有完全相同的键值来帮助维护数据完整性。

尝试为已经包含数据的表创建唯一索引时,将检查组成该索引的列中的值是否唯一;如果该表包含具有重复键值的行,那么索引创建过程将失败。为表定义了唯一索引之后,每当在索引中添加或更改键时就会强制唯一性。(这包括插入、更新、装入、导入和设置完整性以命名一部分。)除了强制数据值的唯一性以外,唯一索引还可用来提高查询处理期间检索数据的性能。

另一方面,非唯一索引不用于对与它们关联的表强制执行约束。相反,非唯一索引通过维护频繁使用的数据值的排序顺序,仅仅用于提高查询性能。

集群索引和非集群索引

索引体系结构分为集群或非集群。集群索引是这样的索引:数据页中的行的顺序对应于索引中的行的顺序。这就是为何给定表中只能存在一个集群索引,而表中可以存在多个非集群索引。在某些关系数据库管理系统中,集群索引的叶子节点对应于实际数据,而不是对应于指向位于其他地方的数据的指针。

集群索引和非集群索引都只包含索引结构中的键和记录标识。记录标识始终指向数据页中的行。集群索引和非集群索引的位于区别在于:数据库管理器尝试按照相应的键在索引页中的出现顺序来将数据保存在数据页中。因此,数据库管理器将尝试把具有相似键的行插入同一页中。如果对表进行了重组,那么会按照索引键的顺序将行插入数据页中。

重组与所选索引相关的表将对数据重新建立集群。建立了集群的索引对于带有范围谓词的列非常有用,因为它允许对表中的数据作更有效的顺序访问。由于相似的值在同一数据页上,从而减少页访存次数。

通常,表中只有一个索引可以具有较高的集群度。

由于集群索引使存储在页面中的数据的访问路径更线性化,所以它们可以提高大多数查询操作的性能。此外,由于具有相似索引键值的行都存储在一起,所以在使用集群索引时预取效率通常更高。

但是,不能将集群索引指定为与 CREATE TABLE 语句配合使用的表定义的一部分。相反,只通过执行指定了 CLUSTER 选项的 CREATE INDEX 语句来创建集群索引。然后,ALTER TABLE 语句应用于在表中添加与创建的集群索引对应的主键。然后,此集群索引将用作表的主键索引。
注: 通过使用 ALTER TABLE 语句将表中的 PCTFREE 设置为适当的值,并保留足够的可用空间以将具有相似值的行插入页中,有助于使表保持分群。有关更多信息,请参阅 ../../com.ibm.db2.luw.sql.ref.doc/doc/r0000888.html 以及减少重组表和索引的需要

使用集群索引提高性能

通常,如果集群索引是唯一的,那么集群维护起来就更有效率。

主键或唯一键约束与唯一索引之间的差别

了解主唯一键约束与唯一索引之间没有很大差别这一点很重要。数据库管理器使用唯一索引和 NOT NULL 约束的组合来实现主键约束和唯一键约束的关系数据库概念。因此,唯一索引本身不强制执行主键约束,因为它们允许空值。(虽然空值表示未知值,但在建立索引时,将一个空值视为与其他空值相同。)

因此,如果唯一索引由单个列组成,那么只允许一个空值 - 多个空值将违反唯一约束。同样,如果唯一索引由多个列组成,那么值和空值的特定组合只能使用一次。

双向索引

缺省情况下,双向索引允许按正反两个方向进行扫描。CREATE INDEX 语句的 ALLOW REVERSE SCANS 子句同时启用正向和反向索引扫描,也就是说,按创建索引时的顺序和相反(或反向)顺序。此选项允许您:
  • 便于使用 MIN 和 MAX 函数
  • 访存先前的键
  • 不需要数据库管理器创建临时表来进行反向扫描
  • 消除冗余反向顺序索引
如果指定了 DISALLOW REVERSE SCANS,那么不能反向扫描索引。(但实际上它将与 ALLOW REVERSE SCANS 索引完全相同。)

分区索引和非分区索引

分区数据可以具有非分区索引(存在于一个数据库分区中的单一表空间中)、可以具有本身在一个数据库分区中的一个或多个表空间之间进行分区的索引或者同时具有这两种索引。对分区表执行滚入操作时(即,使用 ALTER TABLE 语句的 ATTACH PARTITION 子句将一个数据分区连接到另一个表),分区索引特别有用。