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/ ,如需转载,请注明出处,否则将追究法律责任。