Hash連接在很多情況下都比嵌套循環連接有低的成本。
其主要思路是:
- 1) 拿到內關係中的所有元素;
- 2) 利用一個Hash函數構建一個內存Hash表;
- 3) 從外關係中一個一個的取出元素;
- 4) 利用Hash函數計算每個元素的Hash值,找到Hash表中關聯的桶;
- 5) 如果桶中有元素和當前外層關係元素相等,則匹配成功。
爲了簡化計算時間複雜度,需要做一些假定:
- 內關係被劃分爲X個桶;
- 利用Hash函數劃分內關係和外關係時,桶的數量相等;
- 匹配一個外關係元素和桶內所有內關係元素的花費是桶內元素的數量。
基於以上假設,時間複雜度是 (M/X) * N + cost_to_create_hash_table(M) + cost_of_hash_function*N,如果Hash函數創建了足夠小尺寸的桶,那麼時間複雜度是O(M+N)。
這種算法也有一個變種:
- 1) 計算內關係和外關係的Hash表;
- 2) 將兩個Hash表放入磁盤;
- 3) 然後依次比較Hash值相同的兩個桶(兩個桶都先加載到內存)。
譯者注:這種算法也可以應用在內存有限時比較兩組海量字符串時。