HASH JOIN 散列連接
hash join是CBO 做大數據集連接時的常用方式。優化器掃描小表(或數據源),利用連接鍵(也就是根據連接字段計算hash 值)在內存中建立hash表,然后掃描大表,每讀到一條記錄就來探測hash表一次,找出與hash表匹配的行。
當小表可以全部放入內存中,其成本接近全表掃描兩個表的成本之和。如果表很大不能完全放入內存,這時優化器會將它分割成若干不同的分區,不能放入內存的部分就把該分區寫入磁盤的臨時段,此時要有較大的臨時段從而盡量提高I/O 的性能。臨時段中的分區都需要換進內存做hash join。這時候成本接近於全表掃描小表+分區數*全表掃描大表的代價和。
當小表可以全部放入內存中,其成本接近全表掃描兩個表的成本之和。如果表很大不能完全放入內存,這時優化器會將它分割成若干不同的分區,不能放入內存的部分就把該分區寫入磁盤的臨時段,此時要有較大的臨時段從而盡量提高I/O 的性能。臨時段中的分區都需要換進內存做hash join。這時候成本接近於全表掃描小表+分區數*全表掃描大表的代價和。
(對以上的過程保持疑問,可能是RDMS的問題,在《數據庫系統概念》一書中,hash join算法的思想是這樣的:對兩個關系的連接屬性分別作hash,hash函數一定要有較好的隨機性和均勻性,如果關系r的一個元組和關系s的一個元組滿足連接條件,那么他們在連接屬性 上有相同的值。如該值經散列函數映射為i,則關系s的那個元組必在H(ri)中,而關系s的那個元組必在H(si)中。因此,H(ri)中的元組只需與H(si)中的元組作比較,而沒有必要與s的其他任何分區作比較。很明顯這種算法比以上算法代價小的多。)
至於兩個表都進行分區,其好處是可以使用parallel query,就是多個進程同時對不同的分區進行join,然后再合並。但是復雜。
hash join可能有優勢:
1,兩個巨大的表之間的連接。
1,兩個巨大的表之間的連接。
2,在一個巨大的表和一個小表之間的連接。
3,可用ordered提示來改變CBO默認的驅動表,可用USE_HASH(table_name1 table_name2)提示來強制使用hash join
hash查詢: time結果
-----------------------------------------------------------------------------------------------------------------------
1.散列連接是CBO做大數據集連接時的常用方式.
2.也可以用USE_HASH(table_name1 table_name2)提示來強制使用散列連接
3.Hash join在兩個表的數據量差別很大的時候.
4.Hash join的工作方式是將一個表(通常是小一點的那個表)做hash運算,將列數據存儲到hash列表中,從另一個表中抽取記錄,做hash運算,到hash列表中找到相應的值,做匹配。
當缺乏索引或者索引條件模糊時,哈希連接連接比嵌套循環有效。通常比排序合並SORT MERGE JOIN連接快。
在數據倉庫環境下,如果表的紀錄數多,效率高。
參考地址:http://blog.csdn.net/chengweipeng123/article/details/7235387
以下是自己做的一個小測試
hash查詢: IO結果

hash查詢: time結果

-----------------------------------------------------------------------------------------------------------------------