浅谈Oracle中的三种Join方法

基本概念

Nested loop join:

Outer table中的每一行与inner table中的相应记录join,类似一个嵌套的循环。

Sort merge join:

将两个表排序,然后再进行join。

Hash join:

将两个表中较小的一个在内存中构造一个Hash 表(对Join Key),扫描另一个表,同样对Join Key进行Hash后探测是否可以join,找出与之匹配的行。

一张小表被hash在内存中。因为数据量小,所以这张小表的大多数数据已经驻入在内存中,剩下的少量数据被放置在临时表空间中;

每读取大表的一条记录,就和小表中内存中的数据进行比较,如果符合,则立即输出数据(也就是说没有读取临时表空间中的小表的数据)。而如果大表的数据与小表中临时表空间的数据相符合,则不直接输出,而是也被存储临时表空间中。

当大表的所有数据都读取完毕,将临时表空间中的数据以其输出。如果小表的数据量足够小(小于hash area size),那所有数据就都在内存中了,可以避免对临时表空间的读写。

如果是并行环境下,前面中的第2步就变成如下了:每读取一条大表的记录,和内存中小表的数据比较,如果符合先做join,而不直接输出,直到整张大表数据读取完毕。如果内存足够,Join好的数据就保存在内存中。否则,就保存在临时表空间中。

适用范围

Nested loop join:

适用于outer table(有的地方叫Master table)的记录集比较少(<10000)而且inner table(有的地方叫Detail table)索引选择性较好的情况下(inner table要有index)。

inner table被outer table驱动,outer table返回的每一行都要在inner table中检索到与之匹配的行。当然也可以用ORDERED 提示来改变CBO默认的驱动表,使用USE_NL(table_name1 table_name2)可是强制CBO 执行嵌套循环连接。

cost  = outer access cost + (inner access cost * outer cardinality)

Sort merge join:

用在数据没有索引但是已经排序的情况下。

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

cost = (outer access cost * # of hash partitions) + inner access cost

Hash join:

适用于两个表的数据量差别很大。但需要注意的是:如果HASH表太大,无法一次构造在内存中,则分成若干个partition,写入磁盘的temporary segment,则会多一个I/O的代价,会降低效率,此时需要有较大的temporary segment从而尽量提高I/O的性能。

可以用USE_HASH(table_name1 table_name2)提示来强制使用散列连接。如果使用散列连HASH_AREA_SIZE 初始化参数必须足够的大,如果是9i,Oracle建议使用SQL工作区自动管理,设置WORKAREA_SIZE_POLICY 为AUTO,然后调整PGA_AGGREGATE_TARGET 即可。

也可以使用HASH_JOIN_ENABLED=FALSE(默认为TRUE)强制不使用hash join。

cost = (outer access cost * # of hash partitions) + inner access cost

效率比较

Hash join的主要资源消耗在于CPU(在内存中创建临时的hash表,并进行hash计算),而merge join的资源消耗主要在于磁盘I/O(扫描表或索引)。在并行系统中,hash join对CPU的消耗更加明显。所以在CPU紧张时,最好限制使用hash join。

在绝大多数情况下,hash join效率比其他join方式效率更高:

在Sort-Merge Join(SMJ),两张表的数据都需要先做排序,然后做merge。因此效率相对最差;

Nested-Loop Join(NL)效率比SMJ更高。特别是当驱动表的数据量很大(集的势高)时。这样可以并行扫描内表。

Hash join效率最高,因为只要对两张表扫描一次相关阅读:

基于jquery实现的鼠标拖拽元素复制并写入效果

JavaScript检查是否是正确的日期格式的代码

javascript之AJAX框架使用说明

6行代码实现无组件上传(author:stimson)

Oracle 中实现多表关联更新多个字段

/usr/bin/install: 无法创建一般文件‘/usr/local/man/man1/cjpeg.1’: 没有那个文件

深入聊聊Array的sort方法的使用技巧.详细点评protype.js中的sortBy方法

使用用于SQL Server的IIS虚拟目录管理实用工具

Win7下通过组策略禁止USB接口的方法

Response 对象之Redirect方法

构建免受 FSO 威胁虚拟主机(一)

sqlserver FOR XML PATH 语句的应用

asp中文件与文件夹常用处理函数(文件后缀、创建文件等)

PHP大批量数据操作时临时调整内存与执行时间的方法

oracle hash join outer,CSS_浅谈Oracle中的三种Join方法,基本概念 Nested loop join: Outer - phpStudy...相关推荐

  1. php中的js弹窗,浅谈javascript中的三种弹窗

    js中三种弹窗 1)alert 弹出警告 无返回值---------alert('第一行\n第二行'); 2)confirm()选择确定或取消,返回t或f----var result = confir ...

  2. php css定位到图片上,CSS_浅谈css中图片定位之所有图标放在一张图上,如今做网页为了使网站丰富多 - phpStudy...

    浅谈css中图片定位之所有图标放在一张图上 如今做网页为了使网站丰富多彩,富于表现力,往往需要应用大量的图片/图标.如何处理这些图片,使其尽量不影响网页载入,解析等速度,是一个不大不小的问题.如果你的 ...

  3. oracle pdb是什么意思,浅谈Oracle数据库12c PDB技术

    PDB大致功能描述: 创建: 用create pluggable database的命令, 用file_name_convert的方式拷贝seed pdb的文件到对应的新pdb的路径下.拷贝的是最基本 ...

  4. oracle数据库加复合组件,浅谈oracle复合数据类型 (2)

    二.集合 类似C语言中的数组,在ORACLE7.3及以前的版本中只有一种集合称为PL/SQL表,这种类型的集合依然保留,就是索引(INDEX_BY)表. PL/SQL有三种类型的集合a.Index_b ...

  5. html dom节点类型,浅谈Javascript中的12种DOM节点类型

    前言 DOM的作用是将网页转为一个javascript对象,从而可以使用javascript对网页进行各种操作(比如增删内容).浏览器会根据DOM模型,将HTML文档解析成一系列的节点,再由这些节点组 ...

  6. 三维坐标系带偏航角俯仰角_浅谈三维旋转的三种方法及差异

    概述 在3D图形学中,几何变换大致分为三种:平移变换(Translation).缩放变换(Scaling).旋转变换(Rotation),而其中又以旋转变换(Rotation)最为复杂,通常旋转变换( ...

  7. java四种内部类区别_浅谈Java中的四种内部类

    如果你看过一些JDK和框架源码的话,就经常会发现一般在类的定义中,都会再定义一些其他的类,这些类也同样会被编译成字节码文件,这样的类就被叫做 内部类 ,按照一般的分法,大致可以分为以下四类: 成员内部 ...

  8. workbench设置单元坐标系_浅谈Ansys中的几种坐标系

    这篇简短的文章是我多年前在仿真论坛任ansys版主时发表的,时隔多年,同事正好咨询关于ansys坐标系的知识,就将此贴翻出来解他困惑,自己也重温下当年的技术贴,发给大家,希望对学习ansys的初学者有 ...

  9. 浅谈Zebra斑马打印机三种打印方式的利弊

    经过几个项目的洗礼,对Zebra打印机有了一个初步的了解,也用了好几种方式进行通讯打印,下面我们来谈谈这几种方式的优缺点吧. 主要有以下三种方法: 1.利用ZPLII指令集编写带有位置信息,字体大小, ...

最新文章

  1. AI 真的会带来大规模失业吗?
  2. 是栈还是队列c语言实验报告怎么写,队列和栈(C语言)
  3. linux树形目录结构存放,Linux目录结构
  4. IIS网站或系统验证码不显示问题——使用了托管的处理程序,但是未安装或未完整安装 ASP.NET...
  5. 数据结构 5-3-3 二叉树的线索化
  6. 电量统计(1)-原理
  7. BI—SSIS初步认识
  8. 微型计算机系统教案,微型计算机硬件系统教案
  9. 怎样做终端安全防御?
  10. 【Tinking in Java摘录笔记】第六章 初始化和清理
  11. 沉浸式逆向某汽车app
  12. 回忆老友蒋新松先生及庆贺《机器人产业发展规划》的发布
  13. Vue前端如何与后端进行数据交互
  14. CF545C题解【贪心】
  15. 2020年上半年教育舆情新闻热点事件案例分析报告合集
  16. sublime text3 配置python、ruby、c/c++(c/c++不推荐这个方法)
  17. gif在html里为何会自动停止,CSS或JS实现gif动态图片的停止与播放
  18. 永恒python奇美拉_利用USearch去除嵌合体(chimeras)
  19. 第九届蓝桥杯c/c++A组省赛题解
  20. 程序员常见English word

热门文章

  1. 让您的Eclipse具有千变万化的外观
  2. hanlp中的N最短路径分词
  3. [Firebug]用来武装Firebug的十三款Firefox插件
  4. Rider首个发布候选版加入了性能提升特性
  5. 读取pandas修改单列数据类型
  6. Android测试分析3
  7. PHP Extension Makefile 製作
  8. 可靠性测试-故障模型库
  9. Jquery动画效果--地铁站名指示等效果
  10. oracle网络公开课《存储技术》课件和视频共享下载