设计索引
索引通常用于加速对表的访问。 但是,逻辑数据设计也可以使用索引。
例如,唯一索引不允许列中存在重复值的条目,从而保证了一个表中不会有两行相同。 还可以创建索引,以将一列中的值按升序或降序进行排序。
在创建索引时,还应考虑表结构和最常对这些表执行的查询的类型。 例如,频繁发出的查询的 WHERE 子句中出现的列很适合作为索引。 但是,在较少运行的查询中,索引对 INSERT 和 UPDATE 语句的性能产生的负面影响可能超过所带来的好处。
同样,在经常运行的查询的 GROUP BY 子句中出现的列可能会从创建索引中获益,尤其在用于分组行的值的数目小于要分组的行数时。
在创建索引时,请记住,它们也可以进行压缩。 以后,您可以使用 ALTER INDEX 语句来修改索引,从而启用或禁用压缩功能。
要移除或删除索引,可以使用 DROP INDEX 命令。 删除索引的要求与插入索引相反;即,移除索引条目(或者将其标记为“已删除”)。
设计索引时的准则和注意事项
- 虽然构成一个索引键的列的顺序不会影响索引键的创建,但是当它决定是否使用索引时就可能影响优化器。 例如,如果查询包含
ORDER BY col1,col2
子句,那么可以使用对(col1,col2)
创建的索引,但对(col2,col1)
创建的索引没什么帮助。 同样,如果查询指定了诸如where col1 >= 50 and col1 <= 100
或where col1=74
之类的条件,那么对 (col1
) 或对 (col1,col2
) 的索引可能有帮助,但对(col2,col1)
的索引的帮助要小得多。注: 尽可能将索引键中的列从最不同的列排序到最不不同的列排序。 此排序提供最佳性能。 可以对特定的表定义任意数目的索引(最大数目为 32767),这些索引能提高查询性能。 索引管理器必须在更新、删除和插入操作期间维护索引。 为接收 很多更新内容的表创建大量索引可能减慢请求的处理速度。 同样,大型索引键也会减慢处理请求的速度。 因此,仅当频繁访问有明显 有利之处时,才使用索引。
不是唯一索引键的一部分但要在该索引中存储或维护的列数据称为包含列。 只能为唯一索引指定包含列。 当用包含列创建索引时,仅对唯一键列进行排序并考虑其唯一性。 使用包含列可以启用仅访问索引来进行数据检索,从而提高性能。
如果要建立索引的表是空的,那么仍会创建索引,但是在装入该表或插入行之前,不会建立任何索引条目。 如果该表不为空,那么数据库管理器将在处理 CREATE INDEX 语句时创建索引条目。
对于集群索引,数据库管理器会尝试将表的新行插入到具有(由索引定义的)相似键值的现有行附近。
如果要让主键索引成为集群索引,那么不应在 CREATE TABLE 语句中指定主键。 一旦创建了 主键,就不能修改相关的索引。 而是发出不带主键子句的 CREATE TABLE。 然后,发出 CREATE INDEX 语句,并指定集群属性。 最后,使用 ALTER TABLE 语句添加与 刚创建的索引对应的主键。 此索引将用作主键索引。
如果您有分区表,缺省情况下,您创建的任何索引都是分区索引,除非您创建不包括分区键的唯一索引。 您还可以将索引作为非分区索引来创建。
从 Db2® 版本 9.7 修订包 1 开始,您可以在分区表上创建基于 XML 数据的索引作为分区数据或非分区数据。 缺省情况下将创建分区索引。
对分区表执行滚入操作时(使用 ALTER TABLE 语句的 ATTACH PARTITION 子句将一个数据分区连接到另一个表),分区索引具有优势。 借助分区索引,您可以避免必须对非分区索引执行的索引维护工作。 如果分区表使用非分区索引,那么您必须使用 SET INTEGRITY 语句来维护非分区索引(通过合并新连接的分区中的索引键)。 此操作不仅耗时,而且可能需要大量的日志空间,这取决于正在滚入的行数。
- 索引会消耗磁盘空间。 该磁盘空间大小取决于键列的长度和要建立索引的行数。 随着插入到表中的数据增多,索引大小也会增加。 因此,在规划数据库大小时,应考虑要建立索引的数据量。 下面是一些建立索引大小的注意事项:
- 主键和唯一键约束始终创建系统生成的唯一索引。
- 创建 MDC 表时还会将创建系统生成的块索引。
- XML 列将始终导致创建由系统生成的索引(其中包括列路径索引和区域索引)。
- 对外键约束列创建索引会有好处。
- 是否压缩索引(使用 COMPRESS 选项)。
- 可包含在索引中的最大列数受若干因素影响:
- 通常,索引中的最大列数为 64。
- 如果要对类型表建立索引,那么索引中的最大列数为 63。
- 对于被指定随机排序的每列,索引中随机排序的最大列数减 1,因为每个随机排序的列在索引中需要两列空间。
- 索引键的最大长度受若干因素影响:
- 索引键的最大长度(包括所有组件)为 IndexPageSize ÷ 4。
- 索引键的最大长度不能大于页大小的索引键长度限制(由常规 SQL 限制指定)。
- 在数据库升级期间,不会对现有索引进行压缩。 如果对表启用数据行压缩功能,那么除非在 CREATE INDEX 语句中指定 COMPRESS NO 选项,否则将对升级后创建的新索引进行压缩。