当前位置: 首页 > news >正文

oracle4表连接,4种Oracle表连接方式

78e103343848dc0c5240283507ff3965.png

Join是一种试图将两个表结合在一起的谓词,一次只能连接2个表,表连接也可以被称为表关联。有多种方法可以将2个表连接起来,当然每种方法都有自己的优缺点,每种连接类型只有在特定的条件下才会发挥出其最大优势。本文我们就来讲一讲4种Oracle表连接方式。

row source(表)之间的连接顺序对于查询的效率有非常大的影响。通过首先存取特定的表,即将该表作为驱动表,这样可以先应用某些限制条件,从而得到一个较小的row source,使连接的效率较高,这也就是我们常说的要先执行限制条件的原因。一般是在将表读入内存时,应用where子句中对该表的限制条件。

目前为止,无论连接操作符如何,典型的连接类型共有3种:

排序 - - 合并连接(Sort Merge Join (SMJ) )、嵌套循环(Nested Loops (NL) )和哈希连接(Hash Join),另外,还有一种Cartesian product(笛卡尔积),一般情况下,尽量避免使用。下面我们来一一介绍这些4种Oracle表连接方式。

1、排序 - - 合并连接(Sort Merge Join, SMJ)

内部连接过程:

1) 首先生成row source1需要的数据,然后对这些数据按照连接操作关联列(如A.col3)进行排序。

2) 随后生成row source2需要的数据,然后对这些数据按照与sort source1对应的连接操作关联列(如B.col4)进行排序。

3) 最后两边已排序的行被放在一起执行合并操作,即将2个row source按照连接条件连接起来

排序是一个费时、费资源的操作,特别对于大表。基于这个原因,SMJ经常不是一个特别有效的连接方法,但是如果2个row source都已经预先排序,则这种连接方法的效率也是蛮高的。

2、嵌套循环(Nested Loops, NL)

这个连接方法有驱动表(外部表)的概念。其实,该连接过程就是一个2层嵌套循环,所以外层循环的次数越少越好,这也就是我们为什么将小表或返回较小 row source的表作为驱动表(用于外层循环)的理论依据。但是这个理论只是一般指导原则,因为遵循这个理论并不能总保证使语句产生的I/O次数最少。有时 不遵守这个理论依据,反而会获得更好的效率。如果使用这种方法,决定使用哪个表作为驱动表很重要。有时如果驱动表选择不正确,将会导致语句的性能很差、很差。

3、哈希连接(Hash Join, HJ)

这种连接是在oracle 7.3以后引入的,从理论上来说比NL与SMJ更高效,而且只用在CBO优化器中。

较小的row source被用来构建hash table与bitmap,第2个row source被用来被hansed,并与第一个row source生成的hash table进行匹配,以便进行进一步的连接。Bitmap被用来作为一种比较快的查找方法,来检查在hash table中是否有匹配的行。特别的,当hash table比较大而不能全部容纳在内存中时,这种查找方法更为有用。这种连接方法也有NL连接中所谓的驱动表的概念,被构建为hash table与bitmap的表为驱动表,当被构建的hash table与bitmap能被容纳在内存中时,这种连接方式的效率极高。

4、笛卡儿乘积(Cartesian Product)

当两个row source做连接,但是它们之间没有关联条件时,就会在两个row source中做笛卡儿乘积,这通常由编写代码疏漏造成(即程序员忘了写关联条件)。笛卡尔乘积是一个表的每一行依次与另一个表中的所有行匹配。在特殊情况下我们可以使用笛卡儿乘积,如在星形连接中,除此之外,我们要尽量不使用笛卡儿乘积。

不同情况下我们采用的Oracle表连接方式也是不同的,对于非等值连接,排序——合并连接的方式效率是比较高的,而哈希连接只能用于等值连接中。如果外部表比较小,并且在内部表上有唯一索引,或有高选择性非唯一索引时,选择嵌套循环。在本站的Oracle教程中,对于如何选择Oracle数据库表连接方式有一套系统的方法供大家学习。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 基于ArcGIS的物流配送系统集成研究
  • php社招面经,PHP面经
  • 久违了的Debian
  • linux查看ip访问日志文件,Nginx 日志文件 访问IP统计
  • JAVA内存泄漏问题
  • Linux tcpip命令,TCP IP协议Linux系统下地址查询命令
  • 揭秘网络规则——是什么限制了你的网速
  • linux权限641,linux之权限管理_1
  • 电脑维修指导手册(联想)
  • kali linux 虚拟机iso 下载,Kali Linux 2016.2发布提供虚拟机以及系统镜像下载
  • linux宝塔打开目录慢,Linux系统宝塔面板系统盘爆满解决方案 _ 厦门SEO
  • 微软发布SQL Server 2008测试版 明年上市
  • mysql linux udf提权,mysql udf提权原理和提权案例分析 udf提权木马下载
  • 与西安协同销售总监赵建春先生避风塘聊天记
  • Linux网络虚拟化之macvlan,linux 网络虚拟化: macvlan
  • 2017-08-04 前端日报
  • 30天自制操作系统-2
  • 4月23日世界读书日 网络营销论坛推荐《正在爆发的营销革命》
  • Apache的80端口被占用以及访问时报错403
  • CNN 在图像分割中的简史:从 R-CNN 到 Mask R-CNN
  • HTTP中的ETag在移动客户端的应用
  • JavaScript新鲜事·第5期
  • Java编程基础24——递归练习
  • mockjs让前端开发独立于后端
  • Spark in action on Kubernetes - Playground搭建与架构浅析
  • weex踩坑之旅第一弹 ~ 搭建具有入口文件的weex脚手架
  • 表单中readonly的input等标签,禁止光标进入(focus)的几种方式
  • 纯 javascript 半自动式下滑一定高度,导航栏固定
  • 对象管理器(defineProperty)学习笔记
  • 聊一聊前端的监控
  • 思考 CSS 架构
  • 思维导图—你不知道的JavaScript中卷
  • 以太坊客户端Geth命令参数详解
  • 《码出高效》学习笔记与书中错误记录
  • # .NET Framework中使用命名管道进行进程间通信
  • #我与Java虚拟机的故事#连载08:书读百遍其义自见
  • (¥1011)-(一千零一拾一元整)输出
  • (160)时序收敛--->(10)时序收敛十
  • (2)nginx 安装、启停
  • (2020)Java后端开发----(面试题和笔试题)
  • (html5)在移动端input输入搜索项后 输入法下面为什么不想百度那样出现前往? 而我的出现的是换行...
  • (Matalb回归预测)PSO-BP粒子群算法优化BP神经网络的多维回归预测
  • (纯JS)图片裁剪
  • (附源码)springboot车辆管理系统 毕业设计 031034
  • (附源码)springboot优课在线教学系统 毕业设计 081251
  • (附源码)ssm高校社团管理系统 毕业设计 234162
  • (回溯) LeetCode 78. 子集
  • (简单有案例)前端实现主题切换、动态换肤的两种简单方式
  • (论文阅读30/100)Convolutional Pose Machines
  • (一)硬件制作--从零开始自制linux掌上电脑(F1C200S) <嵌入式项目>
  • (转)Android学习笔记 --- android任务栈和启动模式
  • (转)winform之ListView
  • *ST京蓝入股力合节能 着力绿色智慧城市服务
  • .gitattributes 文件
  • .NET 8 编写 LiteDB vs SQLite 数据库 CRUD 接口性能测试(准备篇)