集群索引
聚类索引决定表空间中行实际排序(聚类)的方式。 在部分操作中,尤其是涉及大量记录的操作中,聚簇索引能够显著提升性能。 受益于聚簇索引的操作包括分组操作、排序操作以及非相等比较。
除了基于表达式的索引和XML索引之外,任何索引都可以是聚类索引。 一个表上只能定义一个聚簇索引。
您可以在分区表空间或分段表空间上定义聚簇索引。 在分区表空间中,聚集索引可以是分区索引,也可以是二级索引。 如果分区表上的聚集索引不是分区索引,则行在每个数据分区内按聚集顺序排序,而不是跨分区排序。 (在 Db2 UDB for 版本 8 之前,分区索引必须是聚类索引)。 z/OS® 版本之前,分区索引必须是聚类索引)
当表具有聚集索引时,INSERT语句会使 Db2 尽可能按照索引值的顺序插入记录。 除非您在创建或修改其他索引时明确指定CLUSTER,否则您在表中定义的第一个索引将隐式用作聚簇索引。 例如,如果您首先在 EMP 表 EMPNO 列上定义一个唯一索引,则 Db2 会按员工识别号顺序向 EMP 表中插入行,除非您明确定义另一个索引作为聚集索引。
虽然一个表可以有多个索引,但只有一个索引可以是聚簇索引。 如果您没有为表定义聚类索引, Db2 会在排序数据行时将表上创建的第一个索引识别为隐式聚类索引。
- 请始终定义一个聚类索引。 否则, Db2 可能不会选择您希望用于索引的键。
- 定义聚类索引的顺序,以支持大容量数据处理。
使用CREATE INDEX或ALTER INDEX语句中的CLUSTER子句来定义聚簇索引。
示例
CREATE INDEX DEPT_IX
ON EMP
(DEPTNO ASC)
CLUSTER;因此,同一部门的所有行可能都靠得很近。 Db2 通常一次读取即可访问该部门的所有行。 (使用聚类索引并不能保证同一部门的全部行都存储在同一页上。 实际存储的行数取决于行的大小、行数和可用空间。 同样,有些页面可能包含多个部门的行。)
下图显示了EMP表DEPT列的聚类索引;仅显示了一部分行。
假设您随后在同一张表上创建了聚簇索引。 在这种情况下, Db2 将其标识为聚集索引,但不会重新排列表中已有的数据。 数据的组织方式与您创建的原始非聚类索引相同。 然而,当REORG实用程序重新组织表空间时, Db2 会根据新的聚类索引的顺序对数据进行聚类。 因此,如果您确定需要聚类索引,则应在加载表之前定义聚类索引。 如果无法做到,您必须定义索引,然后重新组织表格。 如果在加载表后创建或删除并重新创建聚簇索引,这些更改将在后续重组后生效。