索引
索引 是表的一个或多个列的键值的有序列表。创立索引的缘故因由有两个:
- 确保一个或多个列中值的静心性。
- 进步表盘问的成效。DB2 优化器运用索引进步实行盘问时的成效,或者以索引的按次施展阐发盘问效果。
索引可以定义为静心的或非静心的。非静心的 索引允许重复的键值;静心的 索引只允许一个键值在列表中出现一次。静心的索引允许出现单个空值。但是,第二个空值会招致重复现象抽象,因此不允许。
索引是运用 CREATE INDEX
SQL 语句创立的。为支撑 PRIMARY KEY
或 UNIQUE
束厄狭隘,还会隐式地创立索引。当创立静心索引时,会反省键数据的静心性,如果发现重复的键数据则该行使失败。
索引可以创立为升序、降序或双向。选择哪个选项取决于运用程序如何会面数据。
创立索引
在示例中,BOOKID 列上有一个主键。用户每每是搜索书的题目,以是在 BOOKNAME 上创立索引较量符合。上面这个语句在 BOOKNAME 列上创立一个非静心的升序索引:
CREATE INDEX IBOOKNAME ON BOOKS (BOOKNAME)
索引名 IBOOKNAME 用于创立和删除这个索引。除此之外,在盘问或更新表时不运用该称号。
在默许景遇下,索引按升序创立,但也可以创立降序索引。甚至可以为索引中的各个列指定分例如的按次。上面的语句在 AUTHORID 和 BOOKNAME 列上定义一个索引。AUTHORID 列的值按降序排序,在一致个 AUTHORID 值中 BOOKNAME 列的值按升序排序:
CREATE INDEX I2BOOKNAME ON BOOKS (AUTHOID DESC, BOOKNAME ASC)
在数据库中创立索引时,按照指定的按次存储键。索引要求数据处于指定的按次,从而施舍进步盘问的成效。升序索引还用于确定 MIN
列函数的效果;降序索引用于确定 MAX
列函数的效果。如果运用程序还须要数据按与索引相反的按次排序,那么 DB2 允许创立双向索引。双向 索引使您不消创立逆向索引,而且它使优化器不须要按逆向对数据举行排序。它还允许高效地取得 MIN
和 MAX
函数值。要创立双向索引,应该在 CREATE INDEX
语句中指定 ALLOW REVERSE SCANS
选项:
CREATE INDEX BIBOOKNAME ON BOOKS (BOOKNAME) ALLOW REVERSE SCANS
DB2 不允许创立具有相反定义的多个索引。即使对于为支撑主键或静心性束厄狭隘而隐式创立的索引,这一点也适用。以是,既然 BOOKS 表已经有了一个在 BOOKID 列上定义的主键,那么实验在 BOOKID 列上创立索引将失败。
创立一个索引破耗的时间较量长。DB2 必需读取每一行来提取键,对这些键举行排序,然后将键值列表写到数据库中。如果表较量年夜,那么将运用且则表空间对键举行排序。
索引存储在表空间中。如果表驻留在数据库操持的表空间中,就可以选择将索引放在分例如的表空间中。在创立表时,运用 INDEXES IN
子句定义这一点。表索引的地位在创立表时设置,除非删除侧从头创立表,不然无法改变索引的地位。
DB2 还提供了 DROP INDEX
SQL 语句从数据库中删除索引。索引是无法修改的。如果须要变革索引,例如向键中添加另一个列,必需删除侧从头创立该索引。
集合索引
在每个表上,可以将一个索引创立为集合索引。如果每每以某一次第引用表数据,那么集合索引较量有效。集合索引(clustering index) 定义数据在数据库中存储的次第。在拔出时期,DB2 会试图将新的行安排得接近有雷同键的行。何等的话,在盘问以集合索引序列请求数据时期,可以更快地检索数据。
要将索引创立为集合索引,应该在 CREATE INDEX
语句上指定 CLUSTER
子句:
CREATE INDEX IAUTHBKNAME ON BOOKS (AUTHORID,BOOKNAME) CLUSTER
这个语句在 AUTHORID 和 BOOKNAME 列上创立一个索引,并将其作为集合索引。如果编写的盘问要求列出作者及其所写的所有书籍,这个索引会进步盘问的成效。
在索引中运用包罗的列
在创立索引时,可以选择包罗特其他列数据,这些特其他列数据将与键存储在一同,但实际上它们不是键本人的一局部,以是不被排序。在索引中包罗稀奇列的主要缘故因由是为了进步某些盘问的成效:因为索引页面中已经提供了数据值,DB2 就不须要会面数据页面。只能为静心索引定义包罗的列。但是,在强制实施索引的静心性时不思索包罗的列。
假定我们屡屡须要取得按 BOOKID 排序的书名列表。盘问将如下所示:
SELECT BOOKID,BOOKNAME FROM BOOK ORDER BY BOOKID
上面的语句会创立一个可以进步成效的索引:
CREATE UNIQUE INDEX IBOOKID ON BOOKS (BOOKID) INCLUDE(BOOKNAME)
何等的话,盘问效果所需的所稀有据都呈目前索引中,不须要检索数据页面。
那么,为什么不干脆在索引中包罗所有的数据?起首,这须要占用数据库中更多的物理空间,因为本质上表数据与索引中的数据是重复的。其次,每当更新数据值时,数据的所有拷贝都须要更新,在产生发火许多更新的数据库中,这是一项很年夜的开支。
应该创立什么索引?
上面是创立索引时应该思索的一些事故:
- 因为索引是键值的经久性列表,它们要占用数据库空间。以是,创立许多索引就须要数据库中有更多的存储空间。所需的空间量由键列的长度抉择。DB2 提供了一个工具帮您估计索引的年夜小。
- 索引是值的稀奇本来,以是当表中的数据被更新时,它们也必需被更新。如果表数据屡屡被更新,就要思索特其他索引会对更新成效孕育产生发火什么样的影响。
- 如果在适合的列上定义索引,索引会年夜年夜进步盘问的成效。
DB2 提供了一个称为 Index Advisor 的工具施舍您确定要定义哪些索引。Index Advisor 允许指定将对表实行的义务负载,然后它将发起要为表创立的索引。
版权声明:
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始因由 、作者信息和本声明。不然将穷究功令责任。