ITPub博客

首页 > Linux操作系统 > Linux操作系统 > oracle执行计划七

oracle执行计划七

原创 Linux操作系统 作者:leonwoo 时间:2008-06-17 13:38:27 0 删除 编辑
排序 - - 合并连接(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

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/79730/viewspace-350522/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: oracle执行计划六
下一篇: oracle执行计划八
请登录后发表评论 登录
全部评论

注册时间:2008-06-16

  • 博文量
    20
  • 访问量
    14330