HASH JOIN算法
哈希连接(HASH JOIN) 前文提到,嵌套循环只适合输出少量结果集。如果要返回大量结果集(比如返回100W数据),根据嵌套循环算法,被驱动表会扫描100W次,显然这是不对的。看到这里你应该明白为 什么有些SQL优化了跑几秒,没优化跑几个小时甚至跑1天都不出结果。返回大量结果集适合走HASH JOIN。HASH JOIN算法非常复杂,这里就不讨论了
下面看一个HASH JOIN的例子(基于SCOTT,Oracle11gR2) SQL> select * from table(dbms_xplan.display_cursor(null,null,'ALLSTATS LAST')); PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------- SQL_ID f5f0bv3b9b6s0, child number 1
-------------------------------------
select /*+ full(dept) */ ename,job,sal ,dname,loc from emp,dept where
emp.deptno=dept.deptno Plan hash value: 615168685 --------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers | OMem | 1Mem | Used-Mem |
--------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | 14 |00:00:00.01 | 15 | | | |
|* 1 | HASH JOIN | | 1 | 14 | 14 |00:00:00.01 | 15 | 825K| 825K| 715K (0)|
| 2 | TABLE ACCESS FULL| DEPT | 1 | 4 | 4 |00:00:00.01 | 7 | | | |
| 3 | TABLE ACCESS FULL| EMP | 1 | 14 | 14 |00:00:00.01 | 8 | | | |
-------------------------------------------------------------------------------------------------------------- Predicate Information (identified by operation id):
--------------------------------------------------- 1 - access("EMP"."DEPTNO"="DEPT"."DEPTNO") HASH JOIN需要耗费PGA: OMEM
1MEM
USED_MEM 耗费的PGA OMem、1Mem为执行所需的内存评估值,0Mem为最优执行模式所需内存的评估值,1Mem为one-pass模式所需内存的评估值。 关键词 HASH JOIN DEPT离HASH JOIN关键字最近,表示DEPT是驱动表。 Starts等于1,表示两个表都只扫描了一次。再次强调NESTED LOOPS被驱动表会扫描多次。注意观察Omem,1Mem,Used-Mem,它表 示HASH JOIN 会消耗PGA,当驱动表太大,PGA不能容纳驱动表时,就会产生on-disk HASH JOIN。现在再回去看看NESTED LOOPS,它没有Omem,1Mem,Used-Mem,也就是说NESTED LOOPS不消耗PGA。我们再看执行计划中 ID=1 这步,它有*号,前面提到,执行计划中有*表示这个操作有过滤(filter)或者是有access。HASH JOIN属于access。通过谓词过滤信息 ,我们可以知道HASH JOIN的JOIN列是哪些列在做JOIN。这里就是emp.deptno 和dept.deptno做JOIN。 驱动表和被驱动变都只扫描一次 2. 讲hash jion 原理了 HASH JOIN 需要注意的地方:
1.HASH JOIN 在OLTP环境一般没什么优化的地方,在OLAP环境中可以利用并行优化HASH JOIN。
2.利用等待事件监控HASH JOIN的时候,如果发现在做on-disk HASH JOIN(direct path read/write temp),
可以加大PGA,或者手工设置 work area 分配较大的PGA内存。 4.HASH JOIN 选择小表做驱动表,小表指的不是表的行数,而是指的是 行数*列宽度
例子中,选择dept作为驱动表是因为
dept大小 4*(dname+loc+deptno)宽度 < emp大小14*(ename,job,sal,deptno)宽度
在做HASH JOIN优化的时候要特别注意这点。
5.HASH JOIN只能用于等值连接。 为什么 hash join 只能用于等值 连接??? hash后没法比大小 hash 连接 驱动表大小是由什么 决定的? rows*avg_length
行数*列宽度 列指的是select后面的列,不包含where条件的列。 如果 hash join 驱动表选错了 怎么办? 会出现direct path write temp / read temp hash join 耗费 pga 是驱动表耗费内存,把驱动表放到PGA里 还是 把 驱动表的什么列放pga?
其实是 放 select列 + join列 被驱动表不放入PGA
HASH JOIN算法的更多相关文章
- 数据库 Hash Join的定义,原理,算法,成本,模式和位图
Hash Join只能用于相等连接,且只能在CBO优化器模式下.相对于nested loop join,hash join更适合处理大型结果集 Hash Join的执行计划第1个是hash ...
- 关于join算法的四篇文章
MySQL Join算法与调优白皮书(一) MySQL Join算法与调优白皮书(二) MySQL Join算法与调优白皮书(三) MySQL Join算法与调优白皮书(四) MariaDB Join ...
- 24.join算法/锁_1
一. JOIN算法1.1. JOIN 语法 mysql> select * from t4; +---+------+ | a | b | +---+------+ | | 11 | | | 5 ...
- oracle Hash Join及三种连接方式
在Oracle中,确定连接操作类型是执行计划生成的重要方面.各种连接操作类型代表着不同的连接操作算法,不同的连接操作类型也适应于不同的数据量和数据分布情况. 无论是Nest Loop Join(嵌套循 ...
- MySQL Join算法与调优白皮书(二)
Index Nested-Loop Join (接上篇)由于访问的是辅助索引,如果查询需要访问聚集索引上的列,那么必要需要进行回表取数据,看似每条记录只是多了一次回表操作,但这才是INLJ算法最大 ...
- 022:SQL优化--JOIN算法
目录 一. SQL优化--JOIN算法 1.1. JOIN 写法对比 2. JOIN的成本 3. JOIN算法 3.1. simple nested loop join 3.2. index nest ...
- MySQL8.0 新特性 Hash Join
概述&背景 MySQL一直被人诟病没有实现HashJoin,最新发布的8.0.18已经带上了这个功能,令人欣喜.有时候在想,MySQL为什么一直不支持HashJoin呢?我想可能是因为MySQ ...
- MySQL Nested-Loop Join算法学习
不知不觉的玩了两年多的MySQL,发现很多人都说MySQL对比Oracle来说,优化器做的比较差,其实某种程度上来说确实是这样,但是毕竟MySQL才到5.7版本,Oracle都已经发展到12c了,今天 ...
- Sort merge join、Nested loops、Hash join(三种连接类型)
目前为止,典型的连接类型有3种: Sort merge join(SMJ排序-合并连接):首先生产driving table需要的数据,然后对这些数据按照连接操作关联列进行排序:然后生产probed ...
随机推荐
- Django URL传递参数的方法总结
1 无参数情况 配置URL及其视图如下: 1 2 3 4 (r'^hello/$', hello) def hello(request): return HttpResponse("He ...
- Cocos2D-X2.2.3学习笔记12(瞬间动作)
到眼下我们已经学习了有 坐标系统 内存管理 UI系统 事件处理 几何图形 今天我们来学习动作管理OK 我们来看看类结构图 CCAction 全部动作的基类 以下派生了三个子类:CCFiniteTi ...
- java的Comparator和Comparable
java的Comparator和Comparable 当需要排序的集合或数组不是单纯的数字型时,通常可以使用Comparator或Comparable,以简单的方式实现对象排序或自定义排序. ...
- WIN32读写INI文件方法
在程序中经常要用到设置或者其他少量数据的存盘,以便程序在下一次执行的时候可以使用,比如说保存本次程序执行时窗口的位置.大小.一些用户设置的 数据等等,在 Dos 下编程的时候,我们一般自己产生一个 ...
- yii criteria select column as 与 时间段查询
需要查询某时间段的记录,但是数据库里只有一个时间记录,如果写sql的话,很快的,放到yii里一时竟然没办法... 不过,最后还是解决了,使用了一个第三方的插件 参考http://www.yiifram ...
- linux下常用基本命令操作
#fdisk -l 查看硬盘信息 cat /proc/cpuinfo 查看CPU信息 free -m 查看内存信息 ethtool eth0 查看网卡信息 df -h 查看硬盘各分区可用空间大小 ca ...
- knockout --- foreach -- 前端必备
很久很久没写博客了,丫的,节操掉一地了,颓废了,惭愧. 很久很久没有弄 knouckout.js 了,今天重新操作,蛋疼啊,忘记得差不多了,于是只好硬着头皮再去看官网,于是,feel慢慢回来了. 本来 ...
- 阿里云linux的nginx下面配置多站点
假设有服务器ip为 114.214.85.35 域名1为 www.jieshendada.cn 域名2为 www.jieshenxiaoxiao.cn 1.首先打开nginx域名配置文件存放目录:/ ...
- dropdownlist 二级联动
protected void Page_Load(object sender, EventArgs e) { if (!Page.IsPostBack) { GradeBind(); } } //绑定 ...
- .net 实现 URL重写,伪静态
一,获得Mircosoft URLRewriter.dll: 获得Mircosoft URLRewriter.dll可以到http://www.microsoft.com/china/msdn/lib ...