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

ZDNet软件频道 时间:2009-11-17 作者:赛迪网 yashi | 天新网 我要评论()
本文关键词:数据库 Mssql SQL Server SQL
在Oracle文档上说:对于RBO来说,以from 子句中从右到左的顺序选择驱动表,即最右边的表为第一个驱动表。

对于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, C
where  B.col3 = 10
and    A.col1 = B.col1
and    A.col2 = C.col2
and    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, C
where  A.col1 = B.col1
and    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, C
where  A.col1 = B.col1
and    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优化器了。

数据库

Mssql

SQL Server

SQL


百度大联盟认证黄金会员Copyright© 1997- CNET Networks 版权所有。 ZDNet 是CNET Networks公司注册服务商标。
中华人民共和国电信与信息服务业务经营许可证编号:京ICP证010391号 京ICP备09041801号-159
京公网安备:1101082134