|
| |
精品推荐 |
 |
|
| |
|
|
|
|
通过分析SQL语句的执行计划优化SQL(二)
|
日期:2008年4月23日 作者: 查看:[大字体
中字体 小字体]
|
为例进行说明,假设A表为Row Soruce1,则其对应的连接操作关联列为COL 3;B表为Row Soruce2,则其对应的连接操作关联列为COL 4;
连接类型:
目前为止,无论连接操作符如何,典型的连接类型共有3种: 排序 - - 合并连接(Sort Merge Join (SMJ) ) 嵌套循环(Nested Loops (NL) ) 哈希连接(Hash Join)
排序 - - 合并连接(Sort Merge Join, SMJ)
内部连接过程: 1) 首先生成row source1需要的数据,然后对这些数据按照连接操作关联列(如A.col3)进行排序。 2) 随后生成row source2需要的数据,然后对这些数据按照与sort source1对应的连接操作关联列(如B.col4)进行排序。 3) 最后两边已排序的行被放在一起执行合并操作,即将2个row source按照连接条件连接起来 下面是连接步骤的图形表示: MERGE / \ SORT SORT Row Source 1 Row Source 2
如果row source已经在连接关联列上被排序,则该连接操作就不需要再进行sort操作,这样可以大大提高这种连接操作的连接速度,因为排序是个极其费资源的操作,特别是对于较大的表。 预先排序的row source包括已经被索引的列(如a.col3或b.col4上有索引)或row source已经在前面的步骤中被排序了。尽管合并两个row source的过程是串行的,但是可以并行访问这两个row source(如并行读入数据,并行排序).
SMJ连接的例子: SQL> explain plan for select /*+ ordered */ e.deptno, d.deptno from emp e, dept d where e.deptno = d.deptno order by e.deptno, d.deptno;
Query Plan ------------------------------------- SELECT STATEMENT [CHOOSE] Cost=17 MERGE JOIN SORT JOIN TABLE ACCESS FULL EMP [ANALYZED] SORT JOIN TABLE ACCESS FULL DEPT [ANALYZED]
排序是一个费时、费资源的操作,特别对于大表。基于这个原因,SMJ经常不是一个特别有效的连接方法,但是如果2个row source都已经预先排序,则这种连接方法的效率也是蛮高的。
嵌套循环(Nested Loops, NL) 这个连接方法有驱动表(外部表)的概念。其实,该连接过程就是一个2层嵌套循环,所以外层循环的次数越少越好,这也就是我们为什么将小表或返回较小row source的表作为驱动表(用于外层循环)的理论依据。但是这个理论只是一般指导原则,因为遵循这个理论并不能总保证使语句产生的I/O次数最少。有时不遵守这个理论依据,反而会获得更好的效率。如果使用这种方法,决定使用哪个表作为驱动表很重要。有时如果驱动表选择不正确,将会导致语句的性能很差、很差。
内部连接过程: Row source1的Row 1 -------------- -- Probe -> Row source 2 Row source1的Row 2 -------------- -- Probe -> Row source 2 Row source1的Row 3 -------------- -- Probe -> Row source 2
上一篇:通过分析SQL语句的执行计划优化SQL(一)
下一篇:通过分析SQL语句的执行计划优化SQL(三)
|
| 相关文章: |
|
|
|
| 相关软件: |
|
|
|
|