ORACLE表与表联接的几种方式
三大表与表联接方式
1.NESTED LOOPS 嵌套循环
2.HASH JOIN 哈希联接
3.SORT MERGE 排序合并联接
1.NESTED LOOPS 嵌套循环
嵌套循环的本质是将外部数据集连接到内部数据集,对于外部数据集中与单表谓词匹配的每一行,数据库将检索内部数据集中满足连接谓词的所有行。
工作原理:
a.优化器确定驱动行源并将其指定为外部循环。
b.优化器将另一行源指定为内部循环。
c.从外部行源获取一行
d.探查内部行源以查找与谓词条件匹配的行
e.重复前面的步骤,直到通过获取请求获得所有行
嵌套循环优先使用场景:
a.查询结果集偏小。
b.数据库以优化器模式设置为联接大型数据集FIRST_ROWS
c.内部循环有有效访问方式(例如存在高效索引)
HINT :
/*+ ORDERED USE_NL(d) */ ----d 为内部循环表-被驱动表
2.HASH JOIN 哈希联接
优化器使用两个数据集中的较小者在内存中的连接键上构建哈希表,并使用确定性哈希函数指定哈希表中存储每一行的位置。然后,数据库扫描更大的数据集,探测哈希表以查找满足联接条件的行。
工作原理:
数据库对较小的数据集执行完整扫描,然后在PGA和磁盘上构建一个哈希桶阵列。
当PGA哈希区域填满时,数据库将在哈希表中找到最大的分区,并将其写入磁盘上的临时空间。数据库将磁盘上属于该磁盘分区的任何新行以及PGA中的所有其他行存储。因此,哈希表的一部分在内存中,一部分在磁盘上。
数据库在读取其他数据集时会经过第一遍。
对于每一行,数据库执行以下操作:
将相同的哈希函数应用于一个或多个联接列,以计算相关哈希桶的数量。
探测哈希表,以确定存储桶中的行中是否存在行。
如果散列值指向内存中的一行,则数据库将完成连接并返回该行。但是,如果该值指向磁盘上的哈希分区,则数据库使用与原始数据集相同的分区方案将该行存储在临时表空间中。
数据库逐个读取每个磁盘上的临时分区
数据库将每个分区行连接到相应的磁盘临时分区中的行.
哈希联接优先使用场景:
a.联接相对大量的数据(或必须连接很大比例的小表)且联接为等联接。
HINT : USE_HASH
3.SORT MERGE 排序合并联接
排序合并联接是嵌套循环联接的一种变体。
如果联接中的两个数据集尚未排序,则数据库将它们排序。这些是SORT JOIN操作。对于第一个数据集中的每一行,数据库都会根据匹配的行来探测第二个数据集,并将它们连接起来,并将其起始位置基于上一次迭代中进行的匹配。这就是MERGE JOIN操作。
工作原理:
与嵌套循环联接中一样,排序合并联接读取两个数据集,但在尚未对它们进行排序时对其进行排序。
对于第一个数据集中的每一行,数据库在第二个数据集中找到起始行,然后读取第二个数据集,直到找到不匹配的行。
通常情况下,只有在以下情况发生时,才会使用排序合并连接:
1)RBO模式
2)不等值连接(>,<,>=,<=)
3)哈希连接被禁用时(_HASH_JOIN_ENABLED=false)
4)数据源已排序
HINT:
USE_MERGE
ORACLE表与表联接的几种方式的更多相关文章
- ORACLE数据库实现自增的两种方式
Mysql数据库因为其有自动+1,故一般我们不需要花费太多时间,直接用关键字auto_increment即可,但是Oracle不行,它没有自动增长机制.顾我们需要自己去实现.一般有两种方式,但是这两种 ...
- ORACLE SQL前端补0的三种方式。
前端补0的三种方式. select lpad(sal,8,'0') from emp;select to_char(sal,'00000000') from emp;select substr('00 ...
- mysql copy复制拷贝表数据及结构的几种方式(转)
mysql拷贝表操作我们会常常用到,下面就为您详细介绍几种mysql拷贝表的方式,希望对您学习mysql拷贝表方面能够有所帮助.假如我们有以下这样一个表:id username password--- ...
- 浏览器原生 form 表单POST 数据的两种方式
我们在提交表单的时候,form表单参数中会有一个enctype的参数.enctype指定了HTTP请求的Content-Type. 常用有两种:application/x-www-form-urlen ...
- Form表单提交数据的几种方式
一.submit提交 在form标签中添加Action(提交的地址)和method(post),且有一个submit按钮(<input type='submit'>)就可以进行数据的提交, ...
- struts2学习笔记之五:表单数据收集的几种方式
方法一:struts2对ModelDriven模式的支持(模型驱动模式) Struts2可以采用类似于Struts1中的ActionForm方式收集数据,这样方式叫ModelDriven模式 Acti ...
- AntDesign Form表单字段校验的三种方式
1.使用getFieldDecorator的rules规则 最简单的方法就是使用getFieldDecorator中的rules验证.rules中定义校验规则,message为校验不通过时的提示文字. ...
- 获取form表单元素值的4种方式
<html><head><title></title><script type="text/javascript"> f ...
- 在.jsp中非表单请求action的几种方式总结
转自:https://www.jb51.net/article/35621.htm 1 一: 复制代码 代码如下: <a href="userAction.do?flag=user_r ...
随机推荐
- JS中同步和异步
首先,我们要知道,JavaScript的本质是一门浏览器脚本语言,在执行的时候是一行一行的执行,只有前面的代码执行完了才会执行后面的代码.JS是单线程语言指的就是这个意思. 同步和异步其实在进行任务执 ...
- 理解ASCII,Unicode和UTF-8关系
前言:之前一直就好奇这个问题,但是一直没解决,今天我总算明白了,感谢大佬们的科普 转自:https://blog.csdn.net/Deft_MKJing/article/details/794604 ...
- C#字符串拼接
var name = "李哈哈"; var t = $"我是{name}";
- kubernetes系列(十三) - 存储之Volume
1. Volume简介 1.1 k8s的volume和docker的volume区别 1.2 kubernetes支持的volume类型 2. 重点的volume类型 2.1 emptyDir 2.1 ...
- Qt-文件系统
1 简介 参考视频:https://www.bilibili.com/video/BV1XW411x7NU?p=45 参考文档:<Qt教程.docx> 说明:本文主要介绍Qt的文件系统. ...
- Linux多任务编程之四:exit()函数及其基础实验(转)
来源:CSDN 作者:王文松 转自Linux公社 exit()和_exit()函数 函数说明 创建进程使用fork()函数,执行进程使用exec函数族,终止进程则使用exit()和_exit() ...
- java 面向对象(三十八):反射(二) Class类的理解与获取Class的实例
1.Class类的理解 1.类的加载过程:程序经过javac.exe命令以后,会生成一个或多个字节码文件(.class结尾).接着我们使用java.exe命令对某个字节码文件进行解释运行.相当于将某个 ...
- [jvm] -- 引用篇
四种引用及其应用场景 强引用 强引用是平常中使用最多的引用,强引用在程序内存不足(OOM)的时候也不会被回收. 使用场景:啥时候都在使用 软引用 软引用在程序内存不足时,会被回收. 使用场景:创建缓存 ...
- 题解 洛谷 P5311 【[Ynoi2011]成都七中】
每次询问是关于 \(x\) 所在的连通块,所以考虑用点分树来解决本题. 点分树上每个节点所对应的子树,都是原树中的一个连通块.询问中给定 \(x\) 和区间 \([l,r]\),其就已经确定了原树的一 ...
- 题解 洛谷 P3710 【方方方的数据结构】
因为有撤销操作,所以修改操作可能会只会存在一段时间,因此把时间看作一维,被修改的序列看作一维. 可以把操作都离线下来,对于每个修改操作,就是在二维平面上对一个矩形进行修改,询问操作,就是查询单点权值. ...