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

81次阅读
没有评论

共计 2279 个字符,预计需要花费 6 分钟才能阅读完成。

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 原理及注意事项有哪些问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注丸趣 TV 行业资讯频道了解更多相关知识。

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-07-20发表,共计2279字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)