通过分析SQL语句的执行计划优化SQL(15)

时间:2007-08-27 04:59:00   来源:  作者:  点击:次  出处:技术无忧
关键字:

对于RBO优化器

在ORACLE文档上说:对于RBO来说,以from 子句中从右到左的顺序选择驱动表,即最右边的表为第一个驱动表,这是其英文原文:All things being equal RBO chooses the driving order by taking the tables in the FROM clause RIGHT to LEFT。不过,在我做的测试中,从来也没有验证过这种说法是正确的。我认为,即使在RBO中,也是有一套规则来决定使用哪种连接类型和哪个表作为驱动表,在选择时肯定会考虑当前索引的情况,还可能会考虑where 中的限制条件,但是肯定是与where中限制条件的位置无关。

测试:

如果我创建3个表:

create table A(col1 number(4,0),col2 number(4,0), col4 char(30));create table B(col1 number(4,0),col3 number(4,0), name_b char(30));create table C(col2 number(4,0),col3 number(4,0), name_c char(30));create index inx_col12A on a(col1,col2);

执行查询:

select A.col4 from   B, A, Cwhere  B.col3 = 10and    A.col1 = B.col1and    A.col2 = C.col2and    C.col3 = 5;Execution Plan-----------------------------------------   0      SELECT STATEMENT Optimizer=RULE   1    0   MERGE JOIN   2    1     SORT (JOIN)   3    2       NESTED LOOPS   4    3         TABLE ACCESS (FULL) OF 'B'   5    3         TABLE ACCESS (BY INDEX ROWID) OF 'A'   6    5           INDEX (RANGE SCAN) OF 'INX_COL12A' (NON-UNIQUE)   7    1     SORT (JOIN)   8    7       TABLE ACCESS (FULL) OF 'C'select A.col4 from   B, A, Cwhere  A.col1 = B.col1and    A.col2 = C.col2;Execution Plan-----------------------------------------------   0      SELECT STATEMENT Optimizer=RULE   1    0   MERGE JOIN   2    1     SORT (JOIN)   3    2       NESTED LOOPS   4    3         TABLE ACCESS (FULL) OF 'B'   5    3         TABLE ACCESS (BY INDEX ROWID) OF 'A'   6    5           INDEX (RANGE SCAN) OF 'INX_COL12A' (NON-UNIQUE)   7    1     SORT (JOIN)   8    7       TABLE ACCESS (FULL) OF 'C'

将A表上的索引inx_col12A删除后:

select A.col4 from   B, A, Cwhere  A.col1 = B.col1and    A.col2 = C.col2;Execution Plan-----------------------------------------   0      SELECT STATEMENT Optimizer=RULE   1    0   MERGE JOIN   2    1     SORT (JOIN)   3    2       MERGE JOIN   4    3         SORT (JOIN)   5    4           TABLE ACCESS (FULL) OF 'C'   6    3         SORT (JOIN)   7    6           TABLE ACCESS (FULL) OF 'A'   8    1     SORT (JOIN)   9    8       TABLE ACCESS (FULL) OF 'B'

通过上面的这些例子,使我对oracle文档上的” All things being equal RBO chooses the driving order by taking the tables in the FROM clause RIGHT to LEFT”这句话持怀疑态度。此时,我也不能使用hints来强制优化器使用nested loop,如果使用了hints,这样就自动使用CBO优化器,而不是RBO优化器了。 技术 无忧 pc51.Net


相关文章

    无相关信息

文章评论

共有 0 位网友发表了评论 此处只显示部分留言 点击查看完整评论页面

特别推荐
300x250广告位招租