li
  当前位置:主页 > 性能优化 > 文章内容
li
Oracle中的Hash Join详解
来源: www.HelloDBA.com  作者: fuyuncat    时间:2008-03-30   阅读:29  
本文章共4110字,分3页,当前第1页,快速翻页:
 

一、  hash join概念
     hash join(HJ)是一种用于equi-join(而anti-join就是使用NOT IN时的join)的技术。在Oracle中,它是从7.3开始引入的,
以代替sort-merge和nested-loop join方式,提高效率。在CBO(hash join只有在CBO才可能被使用到)模式下,优化器计算代价时,
首先会考虑hash join。
     可以通过提示use_hash来强制使用hash join,也可以通过修改会话或数据库参数HASH_JOIN_ENABLED=FALSE(默认为TRUE)强
制不使用hash join。
     Hash join的主要资源消耗在于CPU(在内存中创建临时的hash表,并进行hash计算),而merge join的资源消耗主要在于此盘IO
(扫描表或索引)。在并行系统中,hash join对CPU的消耗更加明显。所以在CPU紧张时,最好限制使用hash join。
     在绝大多数情况下,hash join效率比其他join方式效率更高:
     在Sort-Merge Join(SMJ),两张表的数据都需要先做排序,然后做merge。因此效率相对最差;
     Nested-Loop Join(NL)效率比SMJ更高。特别是当驱动表的数据量很大(集的势高)时。这样可以并行扫描内表。
     Hash join效率最高,因为只要对两张表扫描一次。
 
     Hash join一般用于一张小表和一张大表进行join时。Hash join的过程大致如下(下面所说的内存就指sort area,关于过程,后
面会作详细讨论):
1.  一张小表被hash在内存中。因为数据量小,所以这张小表的大多数数据已经驻入在内存中,剩下的少量数据被放置在临时表空间中;
2.  每读取大表的一条记录,就和小表中内存中的数据进行比较,如果符合,则立即输出数据(也就是说没有读取临时表空间中的小表的数
据)。而如果大表的数据与小表中临时表空间的数据相符合,则不直接输出,而是也被存储临时表空间中。
3.  当大表的所有数据都读取完毕,将临时表空间中的数据以其输出。
 
     如果小表的数据量足够小(小于hash area size),那所有数据就都在内存中了,可以避免对临时表空间的读写。
 
     如果是并行环境下,前面中的第2步就变成如下了:
2.  每读取一条大表的记录,和内存中小表的数据比较,如果符合先做join,而不直接输出,直到整张大表数据读取完毕。如果内存足够,
Join好的数据就保存在内存中。否则,就保存在临时表空间中。
二、  Oracle中与hash join相关的参数
     首先,要注意的是,hash join只有在CBO方式下才会被激活。在oracle中与hash join相关的参数主要有以下几个:
1.             HASH_JOIN_ENABLED
     这个参数是控制查询计划是否采用hash join的“总开关”。它可以在会话级和实例级被修改。默认为TRUE,既可以(不是一定,要看优
化器计算出来的代价)使用。如果设为FALSE,则禁止使用hash join。
2.             HASH_AREA_SIZE
     这个参数控制每个会话的hash内存空间有多大。它也可以在会话级和实例级被修改。默认(也是推荐)值是sort area空间大小的两倍
(2*SORT_AREA_SIZE)。要提高hash join的效率,就一定尽量保证sort area足够大,能容纳下整个小表的数据。但是因为每个会话都会
开辟一个这么大的内存空间作为hash内存,所以不能过大(一般不建议超过2M)。
     在Oracle9i及以后版本中,Oracle不推荐在dedicated server中使用这个参数来设置hash内存,而是推荐通过设置



阅读更多内容1 · 2 · 3 · 下一页>>


  上一篇: 如何将高级复制队列表移出系统(S...   下一篇: oracle中各种sql语句的多种写法
li
 §相关评论  
 热点文章

·Resize datafile导致ASM Crash
·在Oracle10g RAC下新增ASM磁盘
·ORACLE SQL性能优化系列 (一)
·oracle性能调优:管理oracle日志
·oracle RAC环境中系统时钟的调
·why:Rac的心跳线不支持交叉线?
·RAC的VIP及实例依赖关系:版本O
·如何启动DataGuard的备用数据库
·系统表空间IO错误 数据损坏处理
·不幸中的万幸:遭遇ORA-00600 [
·用ORACLE的高级复制实现内外网
li
 编辑推荐
·Resize datafile导致ASM Crash
·在Oracle10g RAC下新增ASM磁盘
·ORACLE SQL性能优化系列 (一)
·oracle性能调优:管理oracle日志
·oracle RAC环境中系统时钟的调
·why:Rac的心跳线不支持交叉线?
·RAC的VIP及实例依赖关系:版本O
·如何启动DataGuard的备用数据库
·系统表空间IO错误 数据损坏处理
·不幸中的万幸:遭遇ORA-00600 [
·用ORACLE的高级复制实现内外网
li
 相关篇章
·如何将高级复制队列表移出系统(S...
·高级复制的整体规划策略
·oracle 高级复制中ORA-25207错误...
·oracle ORA-01555错误完全解析之...
·根据statspack来获取生成环境中t...
·oracle创建逻辑standby数据库
·oracle ORA-01555错误完全解析
·高级复制下如何强制删除废弃复制...
·Oracle数据库中高级复制的功能介...
·高级复制下如何强制删除复制组
·oracle中各种sql语句的多种写法
·ORA-600 [qmxiUnpPacked2]错误的...
·ORA-01599与max_rollback_segmen...
·ORA-01650:unable to extend rol...
·ORA-01652:unable to extend tem...
·ORA-01578:Oracle data block co...
·Oracle的sql*plus使用小结
·oracle 数据库的启动和关闭深入分...
·ORA-00600:internal error code,...
·ORA-03113:end-of-file on comm...
 
li
设为首页 | 关于我们 | 技术服务 | 收藏本站 | 网站地图 | 联系方式 | 本站友情连接