1. 程式人生 > >oracle: 表連線方式---hash join原理

oracle: 表連線方式---hash join原理

表的連線方式執行計劃生成的重要方面。

各種連線方式代表不同的連線操作演算法

不同的連線方式也適應不同的資料量資料分佈情況。

巢狀迴圈,隨即讀成本大,合併排序連線,需要大規模的sort操作,記憶體和temp空間壓力大,在處理海量資料隨機讀海量排序,都不能被接受。所以,hash Join連線比較常用。

Hash join 原理

Hash join是藉助hash演算法,連帶小規模的nest loop join,同時利用記憶體空間進行高速資料快取檢索的一種演算法

Hash join演算法步驟:

1)     hash join連線物件依然是2個表,首先選擇出其中一個小表,這裡的小表,就是參與連線操作的資料集合資料量小。對連線列欄位

所有資料值,進行hash 函式操作。Hash函式處理過得資料特徵是‘相同資料值的hash函式值一定相同,不同資料值的hash函式值可能相同’;

2)     經過hash函式處理過的小表連線列,連同資料一起存在oracle PGA空間中,PGA中存在一塊空間為hash_area,專門存放此類型別。並且,依據不同的hash函式值,進行劃分bucket操作,每個bucket中包括所有相同hash函式值的小表資料,同時建立hash鍵值對應點陣圖。

3)     之後對進行hash連線大表資料連線列依次讀取,並將每個hash值進行bucket匹配,定位到適當的bucket上(應用hash檢索演算法)‘

4)     在定位到的bucket中,進行小規模的精確匹配,因為此時的範圍已經縮小,進行匹配的成功率精確度高,同時,匹配是在記憶體中進行,速度較merge sort join快很多。

從原理過程來看,hash join 和 NL,一樣,進行一定的巢狀迴圈匹配操作,不過差異在於匹配進行隨機讀的範圍是受限範圍。不會像NL直接頻繁進行全表規模的隨機讀。

Hash join和 排序合併連線相似之處,都是利用PGA空間進行獨立操作。Hashjoin的bucket就是儲存在記憶體的PGA中,有一塊專門hash_area進行該項操作。選擇小表作為驅動表,就是儘量使PGA記憶體中可以完全裝下小表,不使用temp表空間。這樣hash匹配和精確匹配的速度就有保障。

最後,hash join使用場景是有限制的,最大的一個就是連線僅能使用等值‘=’連線。因為hash匹配的過程只能支援相等操作。還有就是連線列的資料分佈要儘量做到均勻,這樣產生的bucket也會比較均勻,這樣匹配的速度才有保證。如果資料列分佈偏移嚴重,hash join演算法效率會有退化。

轉自:

Oracle表連線操作——Hash Join(雜湊連線)上

http://blog.itpub.net/17203031/viewspace-697442