• DB2 9 根基内情(730 测验)认证指南,第 5 局部: 处理处罚 DB2 工具(6)


    developerWorks








    索引

    索引 是表的一个或多个列的键值的有序列表。创立索引的缘故因由有两个:

    • 确保一个或多个列中值的静心性。
    • 进步表盘问的成效。DB2 优化器运用索引进步实行盘问时的成效,或者以索引的按次施展阐发盘问效果。

    索引可以定义为静心的或非静心的。非静心的 索引允许重复的键值;静心的 索引只允许一个键值在列表中出现一次。静心的索引允许出现单个空值。但是,第二个空值会招致重复现象抽象,因此不允许。

    索引是运用 CREATE INDEX SQL 语句创立的。为支撑 PRIMARY KEYUNIQUE 束厄狭隘,还会隐式地创立索引。当创立静心索引时,会反省键数据的静心性,如果发现重复的键数据则该行使失败。

    索引可以创立为升序、降序或双向。选择哪个选项取决于运用程序如何会面数据。

    创立索引

    在示例中,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 允许创立双向索引。双向 索引使您不消创立逆向索引,而且它使优化器不须要按逆向对数据举行排序。它还允许高效地取得 MINMAX 函数值。要创立双向索引,应该在 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 允许指定将对表实行的义务负载,然后它将发起要为表创立的索引。




    版权声明: 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始因由 、作者信息和本声明。不然将穷究功令责任。

  • 相关阅读:
    从汇编的角度看待const与#define
    从汇编的角度看待变量类型与sizeof的机制
    按字节对齐分析
    堆内存和栈内存的探索
    string源码实现分析
    string源码分析 ——转载 http://blogs.360.cn/360cloud/2012/11/26/linux-gcc-stl-string-in-depth/
    开始了
    atoi函数的实现——面试
    new与malloc的区别,以及内存分配浅析
    [C]C语言中EOF是什么意思?
  • 原文地址:https://www.cnblogs.com/zgqjymx/p/1972948.html
Copyright © 2020-2023  润新知