Oracle hash join

來源:互聯網
上載者:User

 hash join是oracle裡面一個非常強悍的功能,當做hash join時,oracle會選擇一個表作為驅動表,
先根據過濾條件排除不必要的資料,然後將結果集做成hash表,放入進程的hash area,接著掃描第
二張表,將行的索引值做hash運算,到記憶體的hash表裡面去探測,如果探測成功,就返回資料,否
則這行就丟棄掉這個是最基本的解釋,實際情況中,考慮到單個進程PGA的大小,oracle不會讓進
程任意的消耗OS記憶體,hash area是有一定限制的,所以在oracle中,hash也有三種模式:
optimal,onepass,multipass
optimal:當驅動結果集產生的hash表全部可以放入PGA的hash area時,稱為optimal,大致過程如
下:
1.先根據驅動表,得到驅動結果集
2.在hash area產生hash bulket,並將若干bulket分成一組,成為一個partition,還會產生一個bitmap
的列表,每個bulket在上面佔一位
3.對結果集的join鍵做hash運算,將資料分散到相應partition的bulket中,當運算完成後,如果鍵
值唯一性較高的話,bulket裡的資料會比較均勻,也有可能有的桶裡面資料會是空的,這樣bitmap
上對應的標誌位就是0,有資料的桶,標誌位會是1
4.開始掃描第二張表,對jion鍵做hash運算,確定應該到某個partition的某個bulket去探測,探測
之前,會看這個bulket的bitmap是否會1,如果為0,表示沒資料,這行就直接丟棄掉
5.如果bitmap為1,則在桶內做精確匹配,判斷OK後,返回資料
這個是最優的hash join,他的成本基本是兩張表的full table scan,在加微量的hash運算
onepass
如果進程的pga很小,或者驅動表結果集很大,超過了hash area的大小,會怎麼辦?當然會用到臨
時資料表空間,此時oracle的處理方式稍微複雜點需奧注意上面提到的有個partition的概念,可以這麼
理解,資料是經過兩次hash運算的,先確定你的partition,再確定你的bulket,假設hash area小於
整個hash table,但至少大於一個partition的size,這個時候走的就是onepass
當我們產生好hash表後,狀況是部分partition留在記憶體中,其他的partition留在磁碟暫存資料表空間中,
當然也有可能某個partition一半在記憶體,一半在磁碟,剩下的步驟大致如下:
1.掃描第二張表,對join鍵做hash運算,確定好對應的partition和bulket
2.查看bitmap,確定bulket是否有資料,沒有則直接丟棄
3.如果有資料,並且這個partition是在記憶體中的,就進入對應的桶去精確匹配,能匹配上,就返回
這行資料,否則丟棄
4.如果partition是在磁碟上的,則將這行資料放入磁碟中暫存起來,儲存的形式也是
partition,bulket的方式
5.當第二張表被掃描完後,剩下的是驅動表和探測表產生的一大堆partition,保留在磁碟上
6.由於兩邊的資料都按照相同的hash演算法做了partition和bulket,現在只要成對的比較兩邊partition
資料即可,並且在比較的時候,oracle也做了最佳化處理,沒有嚴格的驅動與被驅動關係,他會在
partition對中選較小的一個作為驅動來進行,直到磁碟上所有的partition對都join完
可以發現,相比optimal,他多出的成本是對於無法放入記憶體的partition,重新讀取了一次,所以稱
為onepass,只要你的記憶體保證能裝下一個partition,oracle都會騰挪空間,每個磁碟partition做到
onepass
multipass
這是最複雜,最糟糕的hash join,此時hash area小到連一個partition也容納不下,當掃描好驅動表
後,可能只有半個partition留在hash area中,另半個加其他的partition全在磁碟上,剩下的步驟和
onepass比價類似,不同的是針對partition的處理
由於驅動表只有半個partition在記憶體中,探測表對應的partition資料做探測時,如果匹配不上,這
行還不能直接丟棄,需要繼續保留到磁碟,和驅動表剩下的半個partition再做join,這裡舉例的是
記憶體可以裝下半個partition,如果裝的更少的話,反覆join的次數將更多,當發生multipass時,
partition物理讀的次數會顯著增加

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.