哈希连接(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算法的更多相关文章

  1. 数据库 Hash Join的定义,原理,算法,成本,模式和位图

    Hash Join只能用于相等连接,且只能在CBO优化器模式下.相对于nested loop join,hash join更适合处理大型结果集       Hash Join的执行计划第1个是hash ...

  2. 关于join算法的四篇文章

    MySQL Join算法与调优白皮书(一) MySQL Join算法与调优白皮书(二) MySQL Join算法与调优白皮书(三) MySQL Join算法与调优白皮书(四) MariaDB Join ...

  3. 24.join算法/锁_1

    一. JOIN算法1.1. JOIN 语法 mysql> select * from t4; +---+------+ | a | b | +---+------+ | | 11 | | | 5 ...

  4. oracle Hash Join及三种连接方式

    在Oracle中,确定连接操作类型是执行计划生成的重要方面.各种连接操作类型代表着不同的连接操作算法,不同的连接操作类型也适应于不同的数据量和数据分布情况. 无论是Nest Loop Join(嵌套循 ...

  5. MySQL Join算法与调优白皮书(二)

    Index Nested-Loop Join   (接上篇)由于访问的是辅助索引,如果查询需要访问聚集索引上的列,那么必要需要进行回表取数据,看似每条记录只是多了一次回表操作,但这才是INLJ算法最大 ...

  6. 022:SQL优化--JOIN算法

    目录 一. SQL优化--JOIN算法 1.1. JOIN 写法对比 2. JOIN的成本 3. JOIN算法 3.1. simple nested loop join 3.2. index nest ...

  7. MySQL8.0 新特性 Hash Join

    概述&背景 MySQL一直被人诟病没有实现HashJoin,最新发布的8.0.18已经带上了这个功能,令人欣喜.有时候在想,MySQL为什么一直不支持HashJoin呢?我想可能是因为MySQ ...

  8. MySQL Nested-Loop Join算法学习

    不知不觉的玩了两年多的MySQL,发现很多人都说MySQL对比Oracle来说,优化器做的比较差,其实某种程度上来说确实是这样,但是毕竟MySQL才到5.7版本,Oracle都已经发展到12c了,今天 ...

  9. Sort merge join、Nested loops、Hash join(三种连接类型)

    目前为止,典型的连接类型有3种: Sort merge join(SMJ排序-合并连接):首先生产driving table需要的数据,然后对这些数据按照连接操作关联列进行排序:然后生产probed ...

随机推荐

  1. Photography theory: a beginner's guide(telegraph.co.uk)

    By Diane Smyth, Tim Clark, Rachel Segal Hamilton and Lewis Bush 11:00AM BST 09 Jun 2014   Have you r ...

  2. unix网络编程第三版源代码ubuntu下配置的问题解决

    第一步:首先下载本书配套的源码unpv13e.tar.gz 第二步:解压后进入根文件夹有一个README 4 Execute the following from the src/ directory ...

  3. [AngularJS] Design Pattern: Simple Mediator

    We're going to use rootScope emit here to send out events and then we're going to listen for them in ...

  4. [Angular + Webpack] ocLazyLoad compoment

    $stateProvider .state('landing', { url: '/', views: { 'body@': { template: '<olr-landing></ ...

  5. [Redux] Implementing Store from Scratch

    Learn how to build a reasonable approximation of the Redux Store in 20 lines. No magic! const counte ...

  6. Java基础知识强化75:正则表达式之分割功能(字符串中的数字排序案例)

    1. 案例分析: 我有如下一个字符串:"91 27 46 38 50" 写代码实现最终输出结果是:"27 38 46 50 91" 分析:    (1)定义一个 ...

  7. 关于apache下同IP多域名支持HTTPS和80跳转HTTPS的配置

    httpd-ssl的配置: Listen 443 NameVirtualHost *:443 AddType application/x-x509-ca-cert .crt AddType appli ...

  8. select 响应时间 js

    HTML form select表单标签案例代码如下: 跳转菜单的需要放在head头部标签内的JS脚本代码:<script type="text/javascript"> ...

  9. VS2010 快捷键--我的总结

    启动VS,可在运行中输入“devenv”: [窗口快捷键] Ctrl+Alt+L 解决方案管理器 Ctrl+W,C: 类视图      Ctrl+W,O: 输出视图      Ctrl+W,T: 任务 ...

  10. return;,return false,return true----------浅析

    作为新手,一直没注意他们的区别,今天特意在网上搜了搜. 1: retuen; 无返回值,表示终止函数往下执行 2: return true; a.返回 bool值 真 b.提交表单 针对<but ...