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
最新文章
- 可变长度的Fibonacci数列
- AspxSpy2014 Final
- 【python游戏编程之旅】第五篇---嗷大喵爱吃鱼小游戏开发实例
- ASP.NET MVC 阻止当前请求的视图页面缓存OutputCache
- delete大批量数据引起空间爆满处理
- CSS知识点:font小细节
- PHP科普
- Azure Automation Deploy (ARM)
- NTFS权限和共享权限的区别
- webpy学(ban)习(砖)记录
- 转载 --- SKLearn中预测准确率函数介绍
- 《数据库系统概念》10-ER模型
- 开启mac上印象笔记的代码块
- Weka算法Clusterers-Xmeans源代码分析(一)
- Kotlin enum class 匿名类实例
- libgdx学习记录5——演员Actor
- ASP.NET Web API实践系列07,获取数据, 使用Ninject实现依赖倒置,使用Knockout实现页面元素和视图模型的双向绑定
- arcgispro字段计算器
- solr相关
- 4.C#WebAPI多版本管理介绍及实现方案详解
热门文章
- 洛谷 P4910 帕秋莉的手环
- 不会用Java Future,我怀疑你泡茶没我快, 又是超长图文!!
- CVE-2020-0796 漏洞复现
- cmder安装(window下好用的终端)
- python面试题:redis数据库
- DirectX11 With Windows SDK--33 曲面细分阶段(Tessellation)
- Nginx to start, restart, shutdown and upgrade
- How to install chinese input method
- 从JDK源码理解java引用
- clang-format的介绍和使用