
1. 排序 - - 合并连接(Sort Merge Join, SMJ)
内部连接过程
:
1
)
首先生成 row source1需要的数据,然后对这些数据按照连接操作关联列(如
A.col3
)
进行排序。
2
)
随后生成 row source2需要的数据,然后对这些数据按照与 sort source1对应的连接
操作关联列(如 B.col4)进行排序。
3
)
最后两边已排序的行被放在一起执行合并操作,即将2个 row source 按照连接条件
连接起来
下面是连接步骤的图形表示:
MERGE
/\
SORTSORT
||
Row Source 1Row 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 FULLEMP [ANALYZED]
SORT JOIN
TABLE ACCESS FULL DEPT [ANALYZED]
排序是一个费时、费资源的操作,特别对于大表。基于这个原因,SMJ 经常不是一个特别
有效的连接方法,但是如果 2 个 row source 都已经预先排序,则这种连接方法的效率也是
蛮高的。
评论