1、NESTED LOOP(嵌套循环连接)
对于被连接的数据子集较小的情况。
1)、 过程:从A表抽一条记录,遍历B表查找匹配记录,然后从a表抽下一条,遍历B表,就是一个二重循环。
2)、原理:
for(int i=0;i<=5;i++) {
for(int j=0;j<=10;j++) {
System.out.println("伪代码");
}
}
nested loop join的原理就是这个,只不过外循环为外表的结果集,内循环为内表的结果集,在没有索引的情况下,哪个作为内表,哪个作为外表都无所谓,因为复杂度都是i*j,如果有索引就不一样了,内表肯定是有索引的表(连接列上有索引,别理解差了),这样的复杂度就变成了i了。
3)、使用方法:
使用/* +use_nl(t1,t2) */告诉oracle 强行使用nested loop一般而言,使用nested loop使用数据量小的表作为驱动表(准确说,应该是经过限制条件后返回结果集行数较少的应作为驱动表)
2、MERGE JOIN
通常情况下散列连接的效果都比排序合并连接要好,然而如果行源已经被排过序,在执行排序合并连接时不需要再排序了,这时排序合并连接的性能会优于散列连接。
1)、过程:将两个表排序,然后将两个表合并。
2)、通常情况下,只有在以下情况发生时,才会使用此种JOIN方式:
a.RBO模式
b.不等价关联(>,<,>=,<=,<>)
c.HASH_JOIN_ENABLED=false(hash join是默认开启得)
d.数据源已排序
3)使用方法:USE_MERGE(table_name1 table_name2)来强制使用排序合并连接.
通常来讲,能够使用merge join的地方,hash join都可以发挥更好的性能。
3、HASH JOIN
oracle 是默认开启这个参数(HASH_JOIN_ENABLED=ture)的。
1)、过程:hash join只能在等值连接下使用,其思想是将小的表(内表)存在于hash area内存中做成hash table,之后大表(外表)进行全扫描,每条记录都在连接的值上做hash算法,在内存中查找是否存在于内存中的hash table中。
2)、使用方法:USE_HASH(table_name1 table_name2)
3)、oracle表之间的连接之哈希连接(Hash Join),其特点如下:
a. 驱动表和被驱动表都是最多只被访问一次。
b. 哈希连接的表有驱动顺序。
c. 哈希表连接的表无需要排序,但是他在做连接之前做哈希运算的时候,会用到HASH_AREA_SIZE来创建哈希表。
d. 哈希连接不适用于的连接条件是:不等于<>,大于>,小于<,小于等于<=,大于等于>=,like。
f. 哈希连接索引列在表连接中无特殊要求,与单表情况无异。