中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

共和县| 曲靖市| 三都| 嘉峪关市| 延川县| 崇阳县| 林西县| 左云县| 昌宁县| 桦甸市| 醴陵市| 邢台市| 蓝山县| 芮城县| 英山县| 清原| 方山县| 濮阳县| 开远市| 略阳县| 阜新市| 金山区| 越西县| 彭州市| 罗定市| 淮滨县| 乌兰浩特市| 钟山县| 十堰市| 开化县| 翁牛特旗| 共和县| 惠来县| 奉新县| 凉城县| 汕头市| 榆社县| 内黄县| 灵石县| 石首市| 惠水县|