WEB开发网
开发学院数据库Oracle 通过分析SQL语句的执行计划优化SQL(14) 阅读

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

 2007-08-21 12:38:11 来源:WEB开发网   
核心提示: 得到去除妨碍判断的索引扫描后的执行计划:Execution Plan- 0SELECT STATEMENT Optimizer=CHOOSE 10 MERGE JOIN 21 SORT (JOIN) 32 NESTED LOOPS 43 TABLE ACCESS (FULL) OF 

得到去除妨碍判断的索引扫描后的执行计划:

Execution Plan
-------------------------------------
  0   SELECT STATEMENT Optimizer=CHOOSE
  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'
  7  1 SORT (JOIN)
  8  7 TABLE ACCESS (FULL) OF 'C'

看执行计划的第3列,即字母部分,每列值的左面有空格作为缩进字符。在该列值左边的空格越多,说明该列值的缩进越多,该列值也越靠右。如上面的执行计划所示:第一列值为6的行的缩进最多,即该行最靠右;第一列值为4、5的行的缩进一样,其靠右的程度也一样,但是第一列值为4的行比第一列值为5的行靠上;谈论上下关系时,只对连续的、缩进一致的行有效。

从这个图中我们可以看到,对于NESTED LOOPS部分,最右、最上的操作是TABLE ACCESS (FULL) OF 'B',所以这一操作先执行,所以该操作对应的B表为第一个驱动表(外部表),自然,A表就为内部表了。从图中还可以看出,B与A表做嵌套循环后生成了新的row source ,对该row source进行来排序后,与C表对应的排序了的row source(应用了C.col3 = 5限制条件)进行MSJ连接操作。所以从上面可以得出如下事实:B表先与A表做嵌套循环,然后将生成的row source与C表做排序—合并连接。

通过分析上面的执行计划,我们不能说C表一定在B、A表之后才被读取,事实上,B表有可能与C表同时被读入内存,因为将表中的数据读入内存的操作可能为并行的。事实上许多操作可能为交叉进行的,因为ORACLE读取数据时,如果就是需要一行数据也是将该行所在的整个数据块读入内存,而且还有可能为多块读。

看执行计划时,我们的关键不是看哪个操作先执行,哪个操作后执行,而是关键看表之间连接的顺序(如得知哪个为驱动表,这需要从操作的顺序进行判断)、使用了何种类型的关联及具体的存取路径(如判断是否利用了索引)

在从执行计划中判断出哪个表为驱动表后,根据我们的知识判断该表作为驱动表(就像上面判断ABC表那样)是否合适,如果不合适,对SQL语句进行更改,使优化器可以选择正确的驱动表。

上一页  1 2 3 

Tags:通过 分析 SQL

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接