日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Postgresql中的hybrid hash join(无状态机讲解)

發布時間:2023/12/1 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Postgresql中的hybrid hash join(无状态机讲解) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

hybrid hash join

hybrid hash join是基于grace hash join 的優化。
在postgresql中的grace hash join 是這樣做的:inner table太大不能一次性全部放到內存中,pg會把inner table 和outer table按照join的key分成多個分區,每個分區(有一個inner table子部分也有一個outer table的子部分)保存在disk上。再對每個分區用普通的hash join。每個分區稱為一個batch,通過join key計算出hash value,然后計算出對應的batchNo與BucketNo:計算公式如下:

bucketNo = hash value % nbuckets; batchNo = (hash value / nbuckets) % nbatch; //nbuckets為buckets的個數,nbacth為batch的個數。

大致上和mysql差不多,不過mysql并沒有分buckets。
判斷是否需要多個batch的邏輯如下:
若 inner table的size + buckets的開銷 < work_mem,使用單個batch。否則使用多個batch:

plan_rows:預估的inner table的行數 plan_width:預估的inner table的列數 NTUP_PER_BUCKET:單個buckets的tuple數據 Work_mem:為hashjoin分配的內存配額

hybrid hash join的優化在于:對于第一個batch不必寫入disk,從而避免第一個batch的磁盤IO

具體過程如下:
1、首先對inner table進行分區/分batch,計算batchNo:
如果該tuple屬于batch0,則加入內存中的hashtable中;
否則寫入batchNo對應的disk file中。
總結就是batch0不用寫如磁盤(當然也有例外,在下文會提到)
2、對outer table進行分區/分batch,計算batchNo:
如果tuple屬于batch0,那么用key去內存hashtable尋找(equal_range or find),匹配則輸出,否則繼續讀下一行probe tuple。
否則寫入batchNo對應的disk file中。
3、outer table掃描完畢,batch0也處理完了。
開始按照No處理下一個batchx:
加載batchx的inner table到內存,build hash table
掃描batchx的outer table,進行probe。
batchx處理完,處理batchx+1,直到所有batch都處理完畢。

現在還有一個問題:如果分割后的batch0仍然太大,不能一次性放到內存中,怎么辦?
postgresql的做法是將batch個數翻倍,從原本的n變為2n。重新掃描batch0的tuples,根據nbatch = 2n,重新計算所屬的batch。如果重新計算后的batcth仍然屬于batch0,就保留在內存中,否則從內存中拿出,寫入到tuple對應的新batch中。
(此時batch0的后半部分數據被分配到batchn上)

注意,此時不會移動磁盤中batch file中已有的tuple,當處理到該batch的時候會處理。
還記得上文提到的hybrid hash join的取模操作嗎?這個操作保證了,batch數目翻倍后,tuple所屬的batch只會向后擴展。
剛剛說的只是batch0,當我們繼續處理batch_i的時候,可能還是會遇到這個問題。那么就繼續將nbatch數目翻倍吧!
當然tuple所屬的batchNo也會變化。

總結

以上是生活随笔為你收集整理的Postgresql中的hybrid hash join(无状态机讲解)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。