Oracle 表连接方式详解

2014-11-24 18:34:20 · 作者: · 浏览: 0

一、连接方式:


嵌套循环(Nested Loops (NL))


(散列)哈希连接(Hash Join (HJ))


(归并)排序合并连接(Sort Merge Join (SMJ) )


二、连接说明:


2.当执行多个表的连接时,优化器从一个表开始,将它与另一个表连接;然后将中间结果与下一个表连接,以此类推,直到处理完所有表为止。


三、表连接详解:


1.嵌套循环(Nested Loops (NL)):


嵌套循环实现机制(伪代码):


For r1 in (select rows from table_1 where colx={value})


loop


for r2 in (select rows from table_2 that match current row from table_1)


loop


output values from current row of table_1 and current row of table_2;


end loop;


End loop;


这段代码由两个循环构成。


嵌套循环中的这两个表通常称为外部表(outer table)和内部表(inner table)。


在嵌套循环连接中,外部表又称为驱动表(driver table)


伪代码中:table_1为驱动表,table_2为内表


从伪代码中可以看出该连接过程就是一个2层嵌套循环,所以外层循环的次数越少越好,这也就是我们为什么将小表或返回较小结果集的表作为驱动表的原因。



2.(散列)哈希连接(Hash Join (HJ)):


Hash join一般用于一张小表和一张大表进行join在绝大多数情况下,hash join效率比其他join方式效率更高


3.排序合并连接(Sort Merge Join (SMJ) ):


通常情况下散列连接的效果都比排序合并连接要好,然而如果行源已经被排过序,在执行排序合并连接时不需要再排序了,这时排序合并连接的性能会优于散列连接。可以使用USE_MERGE(table_1 table_2)来强制使用排序合并连接。


过程:将两个表排序,然后将排序后两个表合并。