11 -【cmu15-721】【高級數(shù)據(jù)庫系統(tǒng)】【卡內(nèi)基梅隆大學(xué)】【中英字幕】

1. 今天我們要討論并行哈希連接。
2. 并行哈希連接是高性能連接的首選方法。
3. 項目2和項目3的信息已經(jīng)發(fā)布,需要盡快完成。
4. 哈希連接和排序連接是連接的兩種基本方法。
5. 過去幾十年中,哈希連接一直是主流方法,但最新的研究表明無分區(qū)方法可能更好。
6. 下一個目標是最小化我們訪問內(nèi)存的成本。假設(shè)我們在單個節(jié)點上運行,假設(shè)我們要進行連接的數(shù)據(jù)已經(jīng)被加載到內(nèi)存中。現(xiàn)在當我們訪問數(shù)據(jù)時,我們希望確保最大化數(shù)據(jù)的局部性,即希望工作線程訪問的數(shù)據(jù)在同一個CPU緩存中,或者至少在同一個NUMA區(qū)域中。我們還希望在將數(shù)據(jù)加載到CPU緩存時,盡可能地重用數(shù)據(jù),以避免頻繁地從內(nèi)存中讀取數(shù)據(jù),從而浪費時間。為了實現(xiàn)這個目標,在算法實現(xiàn)中,我們需要注意CPU緩存和TLB硬件中的數(shù)據(jù)。我們還需要注意數(shù)據(jù)的順序訪問,以最大化數(shù)據(jù)的局部性。對于隨機訪問,我們可以將數(shù)據(jù)分割成每個操作或步驟都在同一個緩存行中的塊。在進行數(shù)據(jù)分割時,我們需要權(quán)衡計算連接所需的指令數(shù)量和內(nèi)存使用量。有時,不進行數(shù)據(jù)分割可能更好。哈希連接是數(shù)據(jù)系統(tǒng)中最重要的操作之一。我們需要盡可能快地執(zhí)行哈希連接,并利用我們獲得的額外核心。哈希連接的基本步驟包括分區(qū)、構(gòu)建哈希表和探測。分區(qū)階段將數(shù)據(jù)分割成不相交的子集,構(gòu)建階段創(chuàng)建哈希表,探測階段將內(nèi)部表的數(shù)據(jù)
7. 哈希函數(shù)是將任意值映射到較小域的函數(shù),我們希望它既快速又具有較低的碰撞率。
8. 最快的哈希函數(shù)是xxhash,它在速度和碰撞率之間有一個很好的平衡。
9. 線性探測哈希表是最快的實現(xiàn)方式,它使用線性探測來處理碰撞。
10. cuckoo哈希和hopscotch哈希是其他的哈希表實現(xiàn)方式,但它們的性能不如線性探測哈希表。
11. 哈希表是哈希連接的關(guān)鍵數(shù)據(jù)結(jié)構(gòu),用于處理碰撞和查找操作。
12. City Hash、XX Hash和Highway Hash是目前被認為是最先進的哈希函數(shù)算法。
13. XX Hash 3是最新的版本,性能非常出色。
14. City Hash和Farm Hash不使用SIMD指令集,XX Hash可能也不使用SIMD指令集,因為使用SIMD會降低可移植性。
15. 線性探測哈希和鏈式哈希是最常見的哈希表實現(xiàn)方式,其他方法可能不太適合一般情況下使用。
16. Hopscotch Hashing是Robinhood Hashing的一種現(xiàn)代變體,通過限制“鄰域”的大小來控制哈希表的擴展,以提高性能。
17. 一種哈希表的實現(xiàn)方法是Robinhood hashing,可以在鄰近位置進行鍵的移動。
18. 另一種哈希表的實現(xiàn)方法是Cuckoo hashing,可以使用多個哈希函數(shù)和多個哈希表來解決沖突。
19. 在哈希表的構(gòu)建過程中,可以使用布隆過濾器來優(yōu)化查找性能。
20. 在實際系統(tǒng)中,大多數(shù)數(shù)據(jù)系統(tǒng)供應(yīng)商會選擇一種哈希表實現(xiàn)方法,并不會嘗試過多的優(yōu)化。
21. 在哈希連接中,哈希表的性能優(yōu)化并不是最重要的,查詢優(yōu)化器的性能更為關(guān)鍵。