分享

创建索引

 java程序员879 2011-10-27
在默认情况下,索引按升序创建,但也可以创建降序索引。甚至可以为索引
中的各个列指定不同的顺序。
在数据库中创建索引时,按照指定的顺序存储键。索引要求数据处于指定的
顺序,从而帮助提高查询的性能。升序索引还用于确定 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)
这样的话,查询结果所需的所有数据都出现在索引中,不需要检索数据页面 。
那么,为什么不干脆在索引中包括所有的数据?首先,这需要占用数据库中
更多的物理空间,因为本质上表数据与索引中的数据是重复的。其次,每当更 新
数据值时,数据的所有拷贝都需要更新,在发生许多更新的数据库中,这是一 项
很大的开销。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多