oracle: 表連線方式---hash join原理
表的連線方式 是執行計劃生成的重要方面。
各種連線方式代表不同的連線操作演算法。
不同的連線方式也適應不同的資料量和資料分佈情況。
巢狀迴圈,隨即讀成本大,合併排序連線,需要大規模的sort操作,記憶體和temp空間壓力大,在處理海量資料隨機讀,海量排序,都不能被接受。所以,hash Join連線比較常用。
Hash join 原理
Hash join是藉助hash演算法,連帶小規模的nest loop join,同時利用記憶體空間進行高速資料快取檢索的一種演算法。
Hash join演算法步驟:
1) hash join連線物件依然是2個表,首先選擇出其中一個小表,這裡的小表,就是參與連線操作的資料集合資料量小。對連線列欄位
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