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

  • 相关阅读:
    运输装备(codevs 1669)
    考前复习(codevs 2837)
    2014编程之美初赛第一场
    51系列小型操作系统精髓 简单实现
    数学----有趣的扑克牌《一》
    hadoop编程:分析CSDN注冊邮箱分布情况
    [动态规划]UVA437
    Swift学习笔记四:数组和字典
    [动态规划]UVA10285
    freemarker中的left_pad和right_pad
  • 原文地址:https://www.cnblogs.com/fanweisheng/p/11124859.html
Copyright © 2020-2023  润新知