ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 9-索引等级

9-索引等级

原创 Linux操作系统 作者:安佰胜 时间:2010-10-20 10:31:45 0 删除 编辑


9.索引的等级

===============

1、基础表的选择

基础表是指被首先访问的表,根据优化器的不同,sql语句中基础表的选择是不一样的

如果你使用的是CBO,优化器会检查sql语句中的每个表的物理大小,索引的状态,然后有选用花费最低的执行路径

如果你用RBO,并且所有的连接条件都有索引对应,在这种情况下,基础表就会是from子句中列在最后的那个表

----------------

2、多个平等的索引

当sql语句的执行路径可以使用分布在多个表上的多个索引时,oracle会同时使用多个索引并在运行时对他们的记录进行合并,检索出对全部索引有效的记录

在选择索引的时候,唯一索引的等级高于非唯一索引,但这个规律只有在以下条件下才成立

a、当where子句中索引列和常量比较才有效,如果索引列和其他表的索引列相比较,这种子句的等级是很低的

b、如果不同表中两个相同登记的索引被引用,from子句中表的顺序决定哪个会被先使用,后面的子句有最高的优先级

c、如果相同两个相同登记的索引将被引用,where子句中最后面的索引有最高的优先级


举例:

DEPTNO上有一个非唯一性索引,EMP_CAT也有一个非唯一性索引.

SELECT ENAME FROM EMP WHERE DEPT_NO = 20 AND EMP_CAT = ‘A';

这里,DEPTNO索引将被最先检索,然后同EMP_CAT索引检索出的记录进行合并. 执行路径如下:

TABLE ACCESS BY ROWID ON EMP

AND-EQUAL

INDEX RANGE SCAN ON DEPT_IDX

INDEX RANGE SCAN ON CAT_IDX

------------------

3、等式比较和范围比较

当where子句中有索引列,oracle不能合并他们,oracle将用范围比较

举例:

DEPTNO上有一个非唯一性索引,EMP_CAT也有一个非唯一性索引.

SELECT ENAME FROM EMP WHERE DEPTNO > 20 AND EMP_CAT = ‘A';

这里只有EMP_CAT索引被用到,然后所有的记录将逐条与DEPTNO条件进行比较. 执行路径如下:
TABLE ACCESS BY ROWID ON EMP
INDEX RANGE SCAN ON CAT_IDX

---------------------

4、不明确索引等级

当oracle无法判断索引的高低差别,优化器将只使用一个索引,他就是在where字句中被列在最前面的

 

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/13177610/viewspace-676345/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2009-08-26

  • 博文量
    215
  • 访问量
    660358