ITPub博客

首页 > Linux操作系统 > Linux操作系统 > RBO访问路径及说明(一)

RBO访问路径及说明(一)

原创 Linux操作系统 作者:qgrape 时间:2008-05-31 22:08:45 0 删除 编辑

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

RBO Path 1: Single Row by Rowid

这种访问路径仅在where条件中明确了单行Rowid时才有效.一般是在游标中使用.(实际中使用不多)

For example:

SELECT * FROM emp WHERE ROWID = ’AAAA7bAA5AAAA1UAAA’;

执行计划结果如下:

OPERATION OPTIONS OBJECT_NAME

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

SELECT STATEMENT

TABLE ACCESS BY ROWID EMP

RBO Path 2: Single Row by Cluster Join

这种访问路径实在具有相同的簇关联的使用才会使用,并且需要以下两个条件为真:

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.

RBO Path 3: Single Row by Hash Cluster Key with Unique or 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

RBO Path 4: Single Row by Unique or Primary Key

这种访问路径只有当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.

RBO Path 5: Clustered Join

这种访问路径仅适用于有相同簇列连接的语句.假如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

RBO Path 6: Hash Cluster Key

这种访问路进仅对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

RBO Path 7: Indexed Cluster Key

这种访问路径仅在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.

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

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

注册时间:2008-04-09

  • 博文量
    223
  • 访问量
    560981