久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

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

158次閱讀
沒有評論

共計 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字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 高邮市| 大田县| 岗巴县| 陇南市| 漳平市| 雷山县| 泾阳县| 平泉县| 桐柏县| 福安市| 南漳县| 石城县| 阿图什市| 凤台县| 吴桥县| 信丰县| 焦作市| 巢湖市| 会宁县| 昭通市| 汤原县| 绥阳县| 无锡市| 双峰县| 达尔| 阳东县| 明溪县| 大名县| 镇康县| 苏尼特左旗| 昌宁县| 阿拉善盟| 远安县| 肥西县| 新余市| 库车县| 永安市| 大名县| 河南省| 南阳市| 收藏|