oracle 多表连接的三种方式 HASH JOIN 、MERGE JOIN 、NESTED LOOP

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. 哈希连接索引列在表连接中无特殊要求,与单表情况无异。

 

 

 

你可能感兴趣的:(oracle 多表连接的三种方式 HASH JOIN 、MERGE JOIN 、NESTED LOOP)