【表连接方式】

阅读更多

对于三种连接,Oracle我们都可以使用hint来强制让优化器走:use_hash,use_nl,use_merge

三大连接方法的大纲先列如下:

nested loop

从A表抽一条记录,遍历B表查找匹配记录,然后从a表抽下一条,遍历B表。。。

就是一个二重循环

 

hash join

将A表按连接键计算出一个hash表,然后从B表一条条抽取记录,计算hash值,根据hash到A表的hash来匹配符合条件的记录

 

sort merge join

将A,B表都排好序,然后做merge,符合条件的选出

 

 

 

 

 

嵌套循环连接(Nested Loops), 合并联接(Merge), 哈希联接(Hash)的适用情况

 

1.嵌套循环连接(Nested Loops)适用范围

两个表, 一个叫外部表, 一个叫内部表.

 

如果外部输入非常小,而内部输入非常大并且已预先建立索引,那么嵌套循环联接将特别有效率。

 

关于连接时哪个表为outer表,哪个为inner表,我发现sql server会自动给你安排,和你写的位置无关,它自动选择数据量小的表为outer表, 数据量大的表为inner表。

 

 

2.合并联接(Merge)

指两个表在on的过滤条件上都有索引, 都是有序的, 这样, join时, sql server就会使用Merge join, 这样性能更好.

 

如果一个有索引,一个没索引,则会选择Nested Loops join.

 

 

3.哈希联接(Hash)

如果两个表在on的过滤条件上都没有索引, 则就会使用Hash join.

 

也就是说, 使用Hash join算法是由于缺少现成的索引.

你可能感兴趣的:(表连接方式)