zoukankan      html  css  js  c++  java
  • oracle索引的操作

    ORACLE对索引有两种访问模式.

    索引唯一扫描 ( INDEX UNIQUE SCAN)

    大多数情况下, 优化器通过WHERE子句访问INDEX.

    例如:

    表LODGING有两个索引 : 建立在LODGING列上的唯一性索引LODGING_PK和建立在MANAGER列上的非唯一性索引LODGING$MANAGER.

    SELECT *

    FROM LODGING

    WHERE LODGING = ‘ROSE HILL’;

       在内部 , 上述SQL将被分成两步执行, 首先 , LODGING_PK 索引将通过索引唯一扫描的方式被访问 , 获得相对应的ROWID, 通过ROWID访问表的方式 执行下一步检索.

       如果被检索返回的列包括在INDEX列中,ORACLE将不执行第二步的处理(通过ROWID访问表). 因为检索数据保存在索引中, 单单访问索引就可以完全满足查询结果.

       下面SQL只需要INDEX UNIQUE SCAN 操作.

           

            SELECT LODGING

            FROM  LODGING

    WHERE LODGING = ‘ROSE HILL’;

      索引范围查询(INDEX RANGE SCAN)

          适用于两种情况:

    1.       基于一个范围的检索

    2.       基于非唯一性索引的检索

     例1:

          SELECT LODGING

          FROM  LODGING

    WHERE LODGING LIKE ‘M%’;

    WHERE子句条件包括一系列值, ORACLE将通过索引范围查询的方式查询LODGING_PK . 由于索引范围查询将返回一组值, 它的效率就要比索引唯一扫描

    低一些.

    例2:

          SELECT LODGING

          FROM  LODGING

    WHERE MANAGER = ‘BILL GATES’;

      这个SQL的执行分两步, LODGING$MANAGER的索引范围查询(得到所有符合条件记录的ROWID) 和下一步同过ROWID访问表得到LODGING列的值. 由于LODGING$MANAGER是一个非唯一性的索引,数据库不能对它执行索引唯一扫描.

      由于SQL返回LODGING列,而它并不存在于LODGING$MANAGER索引中, 所以在索引范围查询后会执行一个通过ROWID访问表的操作.

      WHERE子句中, 如果索引列所对应的值的第一个字符由通配符(WILDCARD)开始, 索引将不被采用.

     SELECT LODGING

          FROM  LODGING

    WHERE MANAGER LIKE ‘%HANMAN’;

     在这种情况下,ORACLE将使用全表扫描.

  • 相关阅读:
    Delphi线程的终止
    Delphi线程简介---Create及其参数、Resume、Suspend
    谈谈Delphi中的类和对象4---类是一种对数据和操作高度的封装机制 && 类是一种代码重用机制
    LeetCode:链表排序
    LeetCode 二叉树的最小深度
    hadoop的集群安装
    java线程池分析和应用
    Java thread中对异常的处理策略
    Thread interrupt方法解析
    如何偷Android的内存-Tricking Android MemoryFile
  • 原文地址:https://www.cnblogs.com/fanweisheng/p/11124859.html
Copyright © 2011-2022 走看看