• 第11章 索引的管理与维护


    1. Oracle索引是一个独立于表的对象,它可以存放在与表不同的表空间中。即使索引崩溃,甚至索引删除都不会印象真正存有数据的表。

    2. 为什么要引入索引:为了加快查询的速度。

    3. 索引对查询语句的影响:能够加快查询速度。

    4. 索引对DML语句的影响。当对表进行DML操作时,oracle服务器将自动维护基于该表的全部索引,维护方法如下:

     1)当对表进行插入操作时,在对应的索引数据块中插入一行索引项;

     2)当对表进行删除时,oralce服务器仅对索引项进行逻辑删除操作,即仅在所删除的索引上加一个标记,并不是真正的删除该项,只有等该块中所有的项都被删除后才真正地删除它们;

     3)当对表进行删除操作时,服务器实际上对索引进行的是两个操作,一个是逻辑删除,一个是插入操作;

    5. 索引的分类

     1)逻辑分类

       a)单列索引:基于一列的索引;

       b)多列索引:基于多列的索引;

       c)唯一索引:保证表中任何数据行的索引列的值都不相同;

       d)非唯一索引:表中不同数据行的索引列的值可以相同;

       e)基于函数的索引:利用表中的一列或多列使用函数或表达式创建的索引;

     2)物理分类

       a)分区或非分区索引;

       b)b-树:包括正常或反转关键字索引;

       c)位图索引;

    6. B-树

     1)B-树索引的结构

    索引顶端是根节点,该结点中包含的是存有指向索引中下一级指针的项,接下来是分枝结点,分支结点中的记录存的是指向下一级的指针,最底层为叶子结点,在叶子结点存有指向表中数据行的索引项。索引项是由三部分组成:索引项头,索引列长度和值,ROWID

     2)B-树索引的应用范围

    适合于联机事务处理系统,因为在联机事务处理系统中DML的操作较频繁。

    7.位图索引

     1)位图索引的结构

    位图索引也是一种B-树结构,只是位图索引的叶子结点存的不是ROWID而是每一个键值的位图。

    位图索引的叶子结点包含了如下的部分:索引项头,键值,起始ROWID,终止ROWID,位图段。

     2)位图索引的应用范围

    适合于数据仓库系统,因为在数据仓库系统中表一般都较大但是静态的并且查询较为复杂。

    8. B-树索引和位图索引的主要区别

     1)对于low-cardinality的列使用位图索引要比B-树索引紧凑得多,从而节省了大量的磁盘空间,同时也就减少了I/O,从而达到了提高系统效率的效果;

     2)位图索引所需要的存储空间要比B-树索引小得多,所以Oracle服务器在使用位图索引时将整个位图索引段装入内存中;

     3)B-树索引对关键字的修改相对位图索引来说不算昂贵,在位图索引中修改键值列(索引列)需要使用段一级的锁,而B-树索引使用的是行一级的锁,还有在这种情况下可能要调整位图;

     4)在对位图索引进行逻辑操作时,oracle服务器使用的是位操作,因此位图索引进行逻辑操作的效率是非常高的。

    9.创建索引遵守的原则:

     1)平衡查询和DML的需要;

     2)将其放入单独的表空间,不要与表、临时段或还原段放在一个表空间,可能增减输入/输出(I/O);

     3)使用同一的exten尺寸;

     4)对大索引可考虑使用nologging,通过减少redo操作来提高系统的效率;

     5)索引的INITRANS参数通常应该比相对应表的高;

    10.创建索引

       create [unique|bitmap] index [用户名.]索引名

          on [用户名.]表名(列名 [asc|desc],)

           [tablespace 表空间名]

          [pctfree 正整型数] 在创建索引时每一个块预留的空间

          [initrans 正整型数] 在每一个块中预分配的事务记录数,默认值为2

      [maxrans 正整型数] 在每一个块中可以分配的事务记录数的上限

          [logging|nologging]

    11. 查询索引基于表、所在的表空间、索引的类型和索引的状态等信息

        select index_name,table_name,tablespace_name,index_type,uniqueness,status from dba_indexes where owner='SCOTT';

     2)获取用户的索引所基于的表和列的信息

     select index_name,table_name,column_name,index_owner,table_name from dba_ind_columns where table_owner='SCOTT'; 

    12. 为什么要重建索引

      如果索引所基于的表上DML操作频繁(在索引所在的列),那么随着时间的推移,索引的效率可能会变得越来越差,此时就需要重建正常索引和位图索引。

    13. 如何重建索引

         Alter index用户名.索引名 rebuild

    14. 维护索引的一些常用方法

     1)在重建索引时能修改索引的一些存储参数

     2)在大规模装入数据之前,为了避免索引段的自动扩展,可以使用命令手工地分配磁盘空间

     3)当索引段中的磁盘空间没用时可以使用命令来回收这些空间

     4)可以使用命令来合并碎片

    15. 如何标识索引的使用情况

      Alter index 索引名 monitoring usage

    16. 如何获取索引的使用情况

      Select * from v$object_usage

    17. 如何删除索引

      Drop index用户名.索引名

  • 相关阅读:
    pyQt5新手教程 (二)开始你的旅程-编写
    未来写作
    电脑使用问题
    cad学习问题
    chm制作
    github学习之路
    python解决实际问题
    英语学习
    经济学
    通过playgrounds程序学习swift语言及思想
  • 原文地址:https://www.cnblogs.com/kangxuebin/p/2824070.html
Copyright © 2020-2023  润新知