在默认情况下,索引按升序创建,但也可以创建降序索引。甚至可以为索引
中的各个列指定不同的顺序。 在数据库中创建索引时,按照指定的顺序存储键。索引要求数据处于指定的 顺序,从而帮助提高查询的性能。升序索引还用于确定 MIN 列函数的结果;降 序索引用于确定 MAX 列函数的结果。 如果应用程序还需要数据按与索引相反的顺序排序,那么 DB2 允许创建双 向 索引。双向 索引使您不必创建逆向索引,而且它使优化器不需要按逆向对数据 进行排序。它还允许高效地获得 MIN 和 MAX 函数值。
DB2 不允许创建具有相同定义的多个索引。即使对于为支持主键或惟一性约 束而隐式创建的索引,这一点也适用。 创建一个索引花费的时间比较长。 DB2 必须读取每一行来提取键,对这些键 进行排序,然后将键值列表写到数据库中。如果表比较大,那么将使用临时表 空 间对键进行排序。 索引存储在表空间中。如果表驻留在数据库管理的表空间中,就可以选择将 索引放在不同的表空间中。在创建表时,使用 INDEXES IN 子句定义这一点。 表 索引的位置在创建表时设置,除非删除并重新创建表,否则无法改变索引的位 置 。 DB2 还提供了 DROP INDEX SQL 语句从数据库中删除索引。索引是无法修改 的。如果需要更改索引,例如向键中添加另一个列,必须删除并重新创建该索 引 。 [ 示例 ]-[ 创建索引 ] :
CREATE INDEX Idx_1 ON TableName(C1) [ 示例 ]-[ 创建包含多列且不同排序规则的索引 ] : CREATE INDEX Idx_2 ON TableName(C1 ASC, C2 DESC) [ 示例 ]-[ 创建双向索引 ] : CREATE INDEX Idx_3 ON TableName(C1) ALLOW REVERSE SCANS [ 示例 ]-[ 删除索引 ] : DROP INDEX Idx_1 3 、 聚集索引
在每个表上,可以将一个索引创建为聚集索引。如果常常以某一次序引用表 数据,那么聚集索引比较有用。聚集索引( clustering index ) 定义数据在数 据库中存储的次序。在插入期间, DB2 会试图将新的行放置得靠近有相似键的 行 。 这样的话,在查询以聚集索引序列请求数据期间,可以更快地检索数据。 要将索引创建为聚集索引,应该在 CREATE INDEX 语句上指定 CLUSTER 子 句: CREATE INDEX IAUTHBKNAME ON BOOKS (AUTHORID,BOOKNAME) CLUSTER 这个语句在 AUTHORID 和 BOOKNAME 列上创建一个索引,并将其作为聚集索
引。如果编写的查询要求列出作者及其所写的所有书籍,这个索引会提高查询 的 性能。 4 、 在索引中使用包含的列
在创建索引时,可以选择包含额外的列数据,这些额外的列数据将与键存储 在一起,但实际上它们不是键本身的一部分,所以不被排序。 在索引中包含额外列的主要原因是为了提高某些查询的性能:因为索引页面 中已经提供了数据值, DB2 就不需要访问数据页面。只能为惟一索引定义包含 的 列。但是,在强制实施索引的惟一性时不考虑包含的列。 假设我们经常需要获得按 BOOKID 排序的书名列表。查询将如下所示: SELECT BOOKID,BOOKNAME FROM BOOK ORDER BY BOOKID 下面的语句会创建一个可能提高性能的索引: CREATE UNIQUE INDEX IBOOKID ON BOOKS (BOOKID) INCLUDE(BOOKNAME) 这样的话,查询结果所需的所有数据都出现在索引中,不需要检索数据页面 。 那么,为什么不干脆在索引中包括所有的数据?首先,这需要占用数据库中 更多的物理空间,因为本质上表数据与索引中的数据是重复的。其次,每当更 新 数据值时,数据的所有拷贝都需要更新,在发生许多更新的数据库中,这是一 项
很大的开销。 |
|
来自: java程序员879 > 《DB2》