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将使用全表扫描.

  • 相关阅读:
    Mybatis JPA 插件简介(v2.1.0)
    linux-非root用户运行tomcat
    java版Web Socket,实现消息推送
    开源巨献:Google最热门60款开源项目
    java加密算法AES与RSA
    Jquery table元素操作-创建|数据填充|重置|隐藏行
    Mybatis JPA-集成方案+源码
    Mybatis JPA 插件简介
    eclipse maven构建
    初探JSP运行机制和与Servlet间的关系
  • 原文地址:https://www.cnblogs.com/fanweisheng/p/11124859.html
Copyright © 2011-2022 走看看