首页 > Linux操作系统 > Linux操作系统 > RBO访问路径及说明(一)
Oracle推荐使用CBO方式,不过在缺乏统计信息的情况下,RBO还是值的关注得.....
使用RBO时,优化器基于可用的访问路径或队列选择相应的执行计划.Oracle访问路径队列是启发式的,可能有多种方式执行一个SQL语句,RBO会选择低队列的操作.
The list shows access paths and their ranking:
RBO Path 1: Single Row by Rowid
RBO Path 2: Single Row by Cluster Join
RBO Path 3: Single Row by Hash Cluster Key with Unique or Primary Key
RBO Path 4: Single Row by Unique or Primary Key
RBO Path 5: Clustered Join
RBO Path 6: Hash Cluster Key
RBO Path 7: Indexed Cluster Key
RBO Path 8: Composite Index
RBO Path 9: Single-Column Indexes
RBO Path 10: Bounded Range Search on Indexed Columns
RBO Path 11: Unbounded Range Search on Indexed Columns
RBO Path 12: Sort Merge Join
RBO Path 13: MAX or MIN of Indexed Column
RBO Path 14: ORDER BY on Indexed Column
RBO Path 15: Full Table Scan
这种访问路径仅在where条件中明确了单行Rowid时才有效.一般是在游标中使用.(实际中使用不多)
For example:
SELECT * FROM emp WHERE ROWID = ’AAAA7bAA5AAAA1UAAA’;
执行计划结果如下:
OPERATION OPTIONS OBJECT_NAME
-----------------------------------------------------
SELECT STATEMENT
TABLE ACCESS BY ROWID EMP
这种访问路径实在具有相同的簇关联的使用才会使用,并且需要以下两个条件为真:
WHERE条件语句中两个关联表的每一个簇列必须相同
WHERE条件语句中必须保证返回一行值
这些条件必须使用AND操作符进行连接,执行语句时,Oracle实施一个嵌套循环操作.
例如,emp和dept表有相同的簇列Deptno,empno是emp表的主键:
SELECT *
FROM emp, dept
WHERE emp.deptno = dept.deptno
AND emp.empno = 7900;
执行计划结果如下:
OPERATION OPTIONS OBJECT_NAME
-----------------------------------------------------
SELECT STATEMENT
NESTED LOOPS
TABLE ACCESS BY ROWID EMP
INDEX UNIQUE SCAN PK_EMP
TABLE ACCESS CLUSTER DEPT
pk_emp is the name of an index that enforces the primary key.
这种访问路径仅在以下两种条件下才可用:
WHERE条件语句中在等式表达式中包括所有的hash cluster键值的列,而且必须使用AND表达式连接;语句要保证返回一条记录,因为构成hash cluster键的列同时就是唯一或主键值;
执行该语句时,Oracle使用cluster hash函数算法从hash cluster键值求出hash值,Oracle使用hash值对表进行hash扫描.
例如:line_items表和Orders表存储在一个hash cluster中,orderno列既是orders表的簇键也是orders表的主键.
SELECT *
FROM orders
WHERE rderno = 65118968;
执行计划如下
OPERATION OPTIONS OBJECT_NAME
-----------------------------------------------------
SELECT STATEMENT
TABLE ACCESS HASH ORDERS
这种访问路径只有当WHERE条件中包括唯一索引或者主键值的所有列而且必须使用AND连接时才可用,
例如:empno是emmp表的主键列:
SELECT *
FROM emp
WHERE empno = 7900;
执行计划如下:
OPERATION OPTIONS OBJECT_NAME
-----------------------------------------------------
SELECT STATEMENT
TABLE ACCESS BY ROWID EMP
INDEX UNIQUE SCAN PK_EMP
pk_emp is the name of the index that enforces the primary key.
这种访问路径仅适用于有相同簇列连接的语句.假如WHERE条件中以等号和AND连接方式连接所有的簇列,就会使用Clustered Join连接,同时实施一个嵌套循环操作.
例如:emp和dept表在具有相同的簇列deptno
SELECT *
FROM emp, dept
WHERE emp.deptno = dept.deptno;
执行计划如下:
OPERATION OPTIONS OBJECT_NAME
-----------------------------------------------------
SELECT STATEMENT
NESTED LOOPS
TABLE ACCESS FULL DEPT
TABLE ACCESS CLUSTER EMP
这种访问路进仅对WHERE条件中使用所有hash cluster键值的列适用,对于一个组合簇键,等式条件必须以AND操作符连接.
例如:orders和line_itmes表存储在一个hash簇中,orderno列是一个簇键
SELECT *
FROM line_items
WHERE rderno = 65118968;
执行计划如下:
OPERATION OPTIONS OBJECT_NAME
-----------------------------------------------------
SELECT STATEMENT
TABLE ACCESS HASH LINE_ITEMS
这种访问路径仅在WHERE语句中等式表达式且使用索引簇键的所有列才适用.
执行语句时,Oracle在簇索引上实施一个唯一扫描用一个特殊的簇键值获取单行rowid
例如,emp表存储在一个索引簇,depno列是一个簇键
SELECT * FROM emp
WHERE deptno = 10;
执行计划:
OPERATION OPTIONS OBJECT_NAME
-----------------------------------------------------
SELECT STATEMENT
TABLE ACCESS CLUSTER EMP
INDEX UNIQUE SCAN PERS_INDEX
pers_index is the name of the cluster index.
这种访问路径仅在以AND操作符且等号条件使用所有组合键值列的条件下适用.Oracle实施一个范围扫描以获取选择行的rowid,再通过rowid访问表.
例如:有一个在job和deptno列上的组合索引
SELECT *
FROM emp
WHERE job = ’CLERK’
AND deptno = 30;
执行计划
OPERATION OPTIONS OBJECT_NAME
-----------------------------------------------------
SELECT STATEMENT
TABLE ACCESS BY ROWID EMP
INDEX RANGE SCAN JOB_DEPTNO_INDEX
job_deptno_index is the name of the composite index on the job and deptno
columns.
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/12330444/viewspace-327239/ ,如需转载,请注明出处,否则将追究法律责任。