sql 查詢強制使用HASH連接性能測試比較


HASH JOIN 散列連接
hash join是CBO 做大數據集連接時的常用方式。優化器掃描小表(或數據源),利用連接鍵(也就是根據連接字段計算hash 值)在內存中建立hash表,然后掃描大表,每讀到一條記錄就來探測hash表一次,找出與hash表匹配的行。
當小表可以全部放入內存中,其成本接近全表掃描兩個表的成本之和。如果表很大不能完全放入內存,這時優化器會將它分割成若干不同的分區,不能放入內存的部分就把該分區寫入磁盤的臨時段,此時要有較大的臨時段從而盡量提高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,兩個巨大的表之間的連接。
2,在一個巨大的表和一個小表之間的連接。
3,可用ordered提示來改變CBO默認的驅動表,可用USE_HASH(table_name1 table_name2)提示來強制使用hash join

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結果 sql <wbr>查詢強制使用HASH連接性能測試比較
hash查詢: time結果
sql <wbr>查詢強制使用HASH連接性能測試比較
-----------------------------------------------------------------------------------------------------------------------
NOT hash查詢: IO結果
sql <wbr>查詢強制使用HASH連接性能測試比較
NOT hash查詢: time結果
sql <wbr>查詢強制使用HASH連接性能測試比較


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM