温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

oracle hash join原理及注意事项有哪些

发布时间:2021-11-12 16:06:30 来源:亿速云 阅读:184 作者:柒染 栏目:关系型数据库

oracle hash join原理及注意事项有哪些,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

7.3引入,仅用于CBO和等值连接,隐含参数_hash_join_enabled默认true,即使为false也可被use_hash覆盖;
Oracle依据hash_area_size/db_block_size/_hash_multiblock_io_count决定hash partition数量,hash表由若干hash partition组成,而每个partition都包含多个hash bucket

表small和big,前者会被选为驱动表,假定其结果集为s,后者为b;
构造驱动表
1 遍历s,对其每条记录按照连接列做hash运算;使用2个hash函数,暂称为func_1/func_2,其hash值为value1和value2;
2 按照value1分配bucket,把s和value2存入其中;只需查询列/连接列即可,不需要整行记录;构造hash partition时每个分区对应1个bitmap,标注该分区所属bucket是否有记录;
3 如果s > hash_area_size,将包含记录最多的partition存入temp,反复直至完成;
4 按记录数对hash partition排序,当s > hash_area_size,则尽量将较小的partition保留内存中;
构造被驱动表
5 遍历b,处理方式与步骤1一样;
6 按照value1匹配s的bucket,然后遍历其所有记录,并校验连接列是否相等;如果成功则返回记录;如果没有在内存中找到bucket,首先访问bitmap,若其记录数>0,暂将b中对应记录写入temp,若=0则直接跳过,即位图过滤;反复直至完成所有位于内存中的s和b的记录;
7 处理temp中的si和bj,分区号相等的结成对sn/bn,记录数较少的作驱动表,以value2构造hash table;反复直至完成


注意事项
1 驱动表连接列的选择性要高,若一个bucket的记录数过多,遍历时会严重消耗CPU且逻辑读不高(位于PGA中),可参照http://www.dbafan.com/blog/?p=151
2 驱动表应尽可能小,最好可全部装入内存hash_area_size


10104事件
跟踪hash join,记录hash partition/bucket以及每个bucket多少条记录


Hint
use_hash(table_1 table_2) 与 use_hash(table_1) + use_hash(table_2)等价,即并不决定连接顺序;
no_swap_join_inputs(rowsource_alias)和swap_join_inputs(rowsource_alias) 可指定驱动表和被驱动表,后者不可swap;

select  /*+ leading(table_1 table_2) use_hash(table_2) no_swap_join_inputs(table_2) */ *
from    t1 table_1, t2 table_2
where   table_1.n1 = table_1.n1;
-----------------------------------------------------------
| Id  | Operation          | Name | Rows  | Bytes | Cost  |
-----------------------------------------------------------
|   0 | SELECT STATEMENT   |      | 45000 |    16M|    44 |
|*  1 |  HASH JOIN         |      | 45000 |    16M|    44 |
|   2 |   TABLE ACCESS FULL| T1   |  3000 |   547K|    14 |
|   3 |   TABLE ACCESS FULL| T2   |  3000 |   547K|    14 |
-----------------------------------------------------------

select  /*+ leading(table_1 table_2) use_hash(table_2) swap_join_inputs(table_2) */ *
from    t1 table_1, t2 table_2
where   table_1.n1 = table_1.n1;

-----------------------------------------------------------
| Id  | Operation          | Name | Rows  | Bytes | Cost  |
-----------------------------------------------------------
|   0 | SELECT STATEMENT   |      | 45000 |    16M|    44 |
|*  1 |  HASH JOIN         |      | 45000 |    16M|    44 |
|   2 |   TABLE ACCESS FULL| T2   |  3000 |   547K|    14 |
|   3 |   TABLE ACCESS FULL| T1   |  3000 |   547K|    14 |
-----------------------------------------------------------

关于oracle hash join原理及注意事项有哪些问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注亿速云行业资讯频道了解更多相关知识。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI