通过分析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 位网友发表了评论 此处只显示部分留言 点击查看完整评论页面