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

Nested loops、Hash join、Sort merge join(三种连接类型原理、使用要点)

nested loop 嵌套循环(原理):
oracle从较小结果集(驱动表、也可以被称为outer)中读取一行,然后和较大结果集(被侦查表,也可以叫做inner)中的所有数据逐条进行比较(也是等值连接,也可以是非等值连接),如果符合规则,就放在结果集中,然后取驱动表的下一条数据继续循环,直到结束。
简单的理解就是:从A表抽一条记录,遍历B表查找匹配记录,然后从a表抽下一条,遍历B表,就是一个二重循环。


使用要点:
1.驱动表的记录集比较小,一般来说小于驱动表结果集的10% 
2.inner表需要有有效的访问方法(Index),选择性要高。


hash join 哈希连接(原理): 
表T1和T2在施加了目标SQL中指定的谓词条件(如果有的话)后得到的结果集中数据量较小的那个结果集(S)会被Oracle选为哈希连接的驱动结果集,T2所对应的结果集的数据量相对较大,我们记为B;S是驱动结果集,B是被驱动结果集;接着Oracle会遍历S,读取S中的每一条记录,并对S中的每一条记录按照该记录在表T1中的连接列做哈希运算,直到遍历完S中的所有记录为止;Oracle会遍历B,读取B中的每一条记录,并对B中的每一条记录按照该记录在表T2中的连接列做哈希运算,最后hash值匹配hash值,返回结果。
简单的理解:将A表按连接键计算出一个hash表,然后从B表一条条抽取记录,计算hash值,根据hash到A表的hash来匹配符合条件的记录。


使用要点:
1. hash join在 oltp 环境下一般没什么优化的地方,在 olap环境中可以并行优化 hash join 
2. 返回大量结果集(几w+)适合走hash join
3. hash join选择小表作为驱动表,注意这里的小表不是指表的行数,而是指的 行数*列的宽度,可以简单的理解为 segment size。
4. hash join会使用到pga中的WORK AREA , 如果等待事件中有on-disk hash join( direct path read/write temp ),可以加大pga size。
5.hash join不适合驱动表表关联字段分布不均匀的情况。

(可以通过10046跟踪,然后查看 Maximum number of rows in a bucket 是否成千上万< 假象执行计划没有问题,但一个超大bucket,将hash join效率极度拉低,消耗大量cpu time   >,一般个数在个位数性能最好,如果一个hash bucket的rows过多,可以改写sql,改变hash table 的列值  )      10046跟踪显示的hash buckets 信息>

### Hash table overall statistics ###
Total buckets: 16384 Empty buckets: 9306 Non-empty buckets: 7078
Total number of rows: 9232
Maximum number of rows in a bucket: 5
Average number of rows in non-empty buckets: 1.304323


sort merge join 排序合并连接(原理):
先排序操作(Sort),再合并操作(Merge)。
简单的理解:将A,B表都排好序,然后做merge,符合条件的选出。

使用要点:
1. 排序合并连接的表无驱动顺序。
2. 排序合并连接不适用于的连接条件是:不等于<>,like,其中大于>,小于<,大于等于>=,小于等于<=,是可以适用于排序合并连接
3. 排序合并连接的表需要排序,用到SORT_AREA_SIZE。
4. 驱动表和被驱动表都是最多只被访问一次。

 

HINT:

操作           Nest Loop       Hash Join             Sort Mereg

Join           USE_NL         USE_HASH            USE_MERGE

Anti Join    NL_AJ            HASH_AJ               MERGE_AJ

Semi          NL_SJ            HASH_SJ              MERGE_SJ

相关文章:

  • GridView中字符串太长处理方式
  • Squid.conf配置文件详解
  • CCF NOI1034 钞票兑换
  • Oracle11_g R2安装配置及PL/SQL Developer安装配置
  • ASP.NET 无权访问所请求的资源。请考虑对 ASP.NET 请求标识授予访问此资源的权限。...
  • 从零到一:用Phaser.js写意地开发小游戏(Chapter 3 - 加载游戏资源)
  • 《SolidWorks 2017中文版机械设计从入门到精通)》——第1章 认识SolidWorks1.1 SolidWorks概述...
  • 《数据科学与大数据分析——数据的发现 分析 可视化与表示》一2.4 第3阶段:模型规划...
  • 《网页美工设计Photoshop+Flash+Dreamweaver从入门到精通》——1.2 网页美工常用工具...
  • 《Pig编程指南》一2.2 运行Pig
  • 《大数据管理概论》一第2章‖大数据融合2.1 引言
  • 重磅启动!翻译斯坦福大学课程:深度学习与自然语言处理
  • 《Android传感器开发与智能设备案例实战》——第2章,第2.2节安装JDK
  • Machine Learning in Action -- Support Vector Machines
  • Linux 内核测试与调试(3)
  • JS中 map, filter, some, every, forEach, for in, for of 用法总结
  • $translatePartialLoader加载失败及解决方式
  • HTTP--网络协议分层,http历史(二)
  • Java 11 发布计划来了,已确定 3个 新特性!!
  • Javascript设计模式学习之Observer(观察者)模式
  • JSONP原理
  • KMP算法及优化
  • Linux链接文件
  • python大佬养成计划----difflib模块
  • react-core-image-upload 一款轻量级图片上传裁剪插件
  • Travix是如何部署应用程序到Kubernetes上的
  • 闭包--闭包作用之保存(一)
  • 产品三维模型在线预览
  • 初识 beanstalkd
  • 关于使用markdown的方法(引自CSDN教程)
  • 简单实现一个textarea自适应高度
  • 名企6年Java程序员的工作总结,写给在迷茫中的你!
  • mysql 慢查询分析工具:pt-query-digest 在mac 上的安装使用 ...
  • PostgreSQL之连接数修改
  • raise 与 raise ... from 的区别
  • Spark2.4.0源码分析之WorldCount 默认shuffling并行度为200(九) ...
  • 东超科技获得千万级Pre-A轮融资,投资方为中科创星 ...
  • 好程序员web前端教程分享CSS不同元素margin的计算 ...
  • 如何通过报表单元格右键控制报表跳转到不同链接地址 ...
  • # Swust 12th acm 邀请赛# [ K ] 三角形判定 [题解]
  • # 手柄编程_北通阿修罗3动手评:一款兼具功能、操控性的电竞手柄
  • #NOIP 2014# day.1 T2 联合权值
  • #快捷键# 大学四年我常用的软件快捷键大全,教你成为电脑高手!!
  • (1)STL算法之遍历容器
  • (JS基础)String 类型
  • (八)Spring源码解析:Spring MVC
  • (四)鸿鹄云架构一服务注册中心
  • (五)关系数据库标准语言SQL
  • .NET Core 和 .NET Framework 中的 MEF2
  • .Net CoreRabbitMQ消息存储可靠机制
  • .Net MVC4 上传大文件,并保存表单
  • .NET委托:一个关于C#的睡前故事
  • /etc/sudoers (root权限管理)
  • @RequestBody与@ResponseBody的使用
  • @ResponseBody