NESTED LOOP JOIN  (NLJOIN)

对于被连接的数据子集较小的情况,nested loop连接是个较好的选择。nested loop就是扫描一个表,每读到一条记录,就根据索引去另一个表里面查找,没有索引一般就不会是 nested loops。 
一般在nested loop中, 驱动表满足条件结果集不大,被驱动表的连接字段要有索引,这样就走nstedloop。如果驱动表返回记录太多,就不适合nested loops了。如果连接字段没有索引,则适合走hash join,因为不需要索引。 
Inner table被Outer table驱动,outer table返回的每一行都要在inner table中检索到与之匹配的行。 
Outer table: 小表、驱动表 
Inner table: 被驱动表、大表 
  (可用ordered提示来改变CBO默认的驱动表,可用USE_NL(table_name1 table_name2)提示来强制使用nested loop。)

HASH JOIN  (HSJOIN)

Hash join是CBO 做大数据集连接时的常用方式。优化器扫描小表(或数据源),利用连接键(也就是根据连接字段计算hash 值)在内存中建立hash表,然后扫描大表,每读到一条记录就来探测hash表一次,找出与hash表匹配的行。 
当小表可以全部放入内存中,其成本接近全表扫描两个表的成本之和。如果表很大不能完全放入内存,这时优化器会将它分割成若干不同的分区,不能放入内存的部分就把该分区写入磁盘的临时段,此时要有较大的临时段从而尽量提高I/O 的性能。临时段中的分区都需要换进内存做hash join。这时候成本接近于全表扫描小表+分区数*全表扫描大表的代价和。 
    至于两个表都进行分区,其好处是可以使用parallel query,就是多个进程同时对不同的分区进行join,然后再合并。但是复杂。 
使用hash join时,HASH_AREA_SIZE初始化参数必须足够的大,如果是9i,Oracle建议使用SQL工作区自动管理,设置WORKAREA_SIZE_POLICY 为AUTO,然后调整PGA_AGGREGATE_TARGET即可。 
以下条件下hash join可能有优势: 
- 两个巨大的表之间的连接。 
- 在一个巨大的表和一个小表之间的连接。 
(可用ordered提示来改变CBO默认的驱动表,可用USE_HASH(table_name1 table_name2)提示来强制使用hash join。)

SORT MERGE JOIN  (MSJOIN)

Sort merge join的操作通常分三步: 
    - 对连接的每个表做table access full; 
    - 对table access full的结果按照连接键进行排序; 
    - 进行merge join对排序结果进行合并。 
Sort merge join性能开销几乎都在前两步。一般是在没有索引的情况下,9i开始已经很少出现了,因为其排序成本高,大多为hash join替代了。 Usually, MSJOIN is used between 2 huge tables.

通常情况下Hash join的效果都比Sort merge join要好,然而如果行源已经被排过序,在执行sort merge join时不需要再排序了,这时sort merge join的性能会优于hash join。 
在全表扫描比索引范围扫描再通过rowid进行表访问更可取的情况下,sort merge join会比nested loops性能更佳。 
(可用USE_MERGE(table_name1 table_name2)提示强制使用sort merge join。)

----分割线----------------------------------------------

SAP Note 1126400 - DB6: Statement Performance is bad due to MSJOIN

DB6一些版本出现了错误使用MSJOIN的问题(应该使用HSJOIN或NLJOIN的情况)。

通过更新DB2的fix及将DB2_REDUCED_OPTIMIZATION变量设为CAP OFF来纠正。

----------------------------------------------------------- 
DB HINT:

/* <OPTGUIDELINES> 
     <HSJOIN> 
       <ACCESS TABLE='T001W' /> 
       <ACCESS TABLE='ADRC' /> 
     </HSJOIN> 
</OPTGUIDELINES> */

Examples:

1.  Forcing NLJOIN with index access on IADB6 as outer and index access on TADB6 as inner table: 
         select a~tabspace 
           from tadb6 as a 
           join iadb6 as b on a~tabart = b~tabart 
           bypassing buffer into :tabspace 
           %_hints db6 '<NLJOIN>' 
                   db6   '<IXSCAN TABLE=''IADB6'' />' 
                   db6   '<IXSCAN TABLE=''TADB6'' />' 
                   db6 '</NLJOIN>' .

=============================================================

三种Join方法的更多相关文章

  1. C#使用DataSet Datatable更新数据库的三种实现方法

    本文以实例形式讲述了使用DataSet Datatable更新数据库的三种实现方法,包括CommandBuilder 方法.DataAdapter 更新数据源以及使用sql语句更新.分享给大家供大家参 ...

  2. MapReduce三种join实例分析

    本文引自吴超博客 实现原理 1.在Reudce端进行连接. 在Reudce端进行连接是MapReduce框架进行表之间join操作最为常见的模式,其具体的实现原理如下: Map端的主要工作:为来自不同 ...

  3. 061 hive中的三种join与数据倾斜

    一:hive中的三种join 1.map join 应用场景:小表join大表 一:设置mapjoin的方式: )如果有一张表是小表,小表将自动执行map join. 默认是true. <pro ...

  4. SQL Server中的三种Join方式

      1.测试数据准备 参考:Sql Server中的表访问方式Table Scan, Index Scan, Index Seek 这篇博客中的实验数据准备.这两篇博客使用了相同的实验数据. 2.SQ ...

  5. Python队列的三种队列方法

    今天讲一下队列,用到一个python自带的库,queue 队列的三种方法有: 1.FIFO先入先出队列(Queue) 2.LIFO后入先出队列(LifoQueue) 3.优先级队列(PriorityQ ...

  6. javase-常用三种遍历方法

    javase-常用三种遍历方法 import java.util.ArrayList; import java.util.Iterator; import java.util.List; public ...

  7. JS面向对象(3) -- Object类,静态属性,闭包,私有属性, call和apply的使用,继承的三种实现方法

    相关链接: JS面向对象(1) -- 简介,入门,系统常用类,自定义类,constructor,typeof,instanceof,对象在内存中的表现形式 JS面向对象(2) -- this的使用,对 ...

  8. Java中Map的三种遍历方法

    Map的三种遍历方法: 1. 使用keySet遍历,while循环: 2. 使用entrySet遍历,while循环: 3. 使用for循环遍历.   告诉您们一个小秘密: (下↓面是测试代码,最爱看 ...

  9. Jquery中each的三种遍历方法

    Jquery中each的三种遍历方法 $.post("urladdr", { "data" : "data" }, function(dat ...

随机推荐

  1. 怎样禁止手机app 中页面有时候会把数字当做电话号码,从而自动进行打电话功能

    想要禁止这种功能,只需要给头不加一个meta标签就可以了, <meta name="format-detection" content="telephone=no& ...

  2. 详细解析 JavaScript 获取元素的坐标

    引言 最近突然看到了有关图片懒加载的问题,大致意思就是初始状态下页面只加载浏览器可视区域的图片,剩余图片在当浏览器可视区域滚动到其位置时才开始加载.貌似现在许多大型网站都有实现懒加载,所以我便就此问题 ...

  3. js实现日期格式化

    <!DOCTYPE html><html><head> <meta charset="utf-8"> <meta http-e ...

  4. SSO(单点登录)与旅游年卡

    SSO(单点登录)与旅游年卡 SSO英文全称Single Sign On,单点登录.SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统.它包括可以将这次主要的登录映射到其他应 ...

  5. MongoDB安全及身份认证

    前面的话 本文将详细介绍MongoDB安全相关的内容 概述 MongoDB安全主要包括以下4个方面 1.物理隔离 系统不论设计的多么完善,在实施过程中,总会存在一些漏洞.如果能够把不安全的使用方与Mo ...

  6. CSS预编译与PostCSS以及Webpack构建CSS综合方案

    CSS全称Cascading Style Sheets(层叠样式表),用来为HTML添加样式,本质上是一种标记类语言.CSS前期发展非常迅速,1994年哈肯·维姆·莱首次提出CSS,1996年12月W ...

  7. (转)JAVA新特征

    Java线程:新特征-有返回值的线程   在Java5之前,线程是没有返回值的,常常为了“有”返回值,破费周折,而且代码很不好写.或者干脆绕过这道坎,走别的路了.   现在Java终于有可返回值的任务 ...

  8. swift3.0 基础练习-实现99乘法表

    用的方法比较笨 大致效果是这样 思路: 第一行 拼接一次 第二行 拼接二次 ... 第九行 拼接九次 //num控制个数 var num = 1 //result为结果 var result = &q ...

  9. 用java写一个用户登陆界面

    一.课堂测试源代码及其结果截图 用java的swing写一个用户登录界面,采用网格布局.源代码如下: /** * */package LiuLijia; import java.awt.CardLay ...

  10. 五. Java集合概要

    了解了Java内存相关的内容后,现在来简单介绍下Java的集合. Set:不含有重复数据的集合.常用的对象HashSet,TreeSet,LinkedHashSet.HashSet拥有很好的性能,其数 ...