專利名稱:一種使用歸并連接實(shí)現(xiàn)優(yōu)美哈希連接的方法
技術(shù)領(lǐng)域:
本發(fā)明屬于數(shù)據(jù)庫技術(shù)領(lǐng)域,涉及的是一種哈希連接算法,算法思想是使用歸并連接來實(shí)現(xiàn)優(yōu)美哈希連接。
背景技術(shù):
哈希連接是在數(shù)據(jù)庫數(shù)據(jù)處理應(yīng)用中,對多表數(shù)據(jù)進(jìn)行連接處理的一種常用方法。如果數(shù)據(jù)量較大的表進(jìn)行連接,連接條件中的列無序或沒有索引、且連接為等值連接時(shí),哈希連接是最佳策略。哈希連接算法主要有簡單哈希連接方法(Simple hash join)、優(yōu)美哈希連接方法 (GRACE hash join)和混合哈希連接算法(Hybrid hash join)。簡單哈希連接算法在左邊數(shù)據(jù)量較大、內(nèi)存不能將左邊數(shù)據(jù)全部緩存時(shí),只能分批對其建立哈希,這樣右邊的數(shù)據(jù)需要多次讀取,次數(shù)為左邊數(shù)據(jù)需要建立的哈希的次數(shù)。 故導(dǎo)致I/O讀取次數(shù)較多,花費(fèi)非常大。優(yōu)美哈希連接在處理左邊數(shù)據(jù)時(shí),是選擇一個(gè)哈希函數(shù)(hash函數(shù)),把左邊和右邊數(shù)據(jù)同時(shí)劃分到不同的子分區(qū)中,且左邊與右邊數(shù)據(jù)的分區(qū)個(gè)數(shù)一致,然后分別對左邊與右邊數(shù)據(jù)對應(yīng)的子分區(qū)進(jìn)行連接。一般情況下,由于避免了多次掃描右邊數(shù)據(jù),優(yōu)美哈希連接的性能優(yōu)于簡單哈希連接。但是在建立左邊與右邊數(shù)據(jù)的相應(yīng)子分區(qū)時(shí),花費(fèi)的時(shí)間代價(jià)也相對較大?;旌瞎_B接算法是簡單哈希連接和優(yōu)美哈希連接算法的結(jié)合,在處理數(shù)據(jù)時(shí),類似優(yōu)美哈希連接把數(shù)據(jù)分成N個(gè)子分區(qū),只是在分成子分區(qū)過程中,借鑒了簡單哈希連接思想,對第一個(gè)子分區(qū)建立哈希時(shí),把這部分?jǐn)?shù)據(jù)全部存放在內(nèi)存中,然后再對其他各對應(yīng)的子分區(qū)進(jìn)行簡單哈希連接處理,這樣當(dāng)大多數(shù)數(shù)據(jù)在第一子分區(qū)時(shí),就減少了這部分?jǐn)?shù)據(jù)的I/O讀取次數(shù)。綜上所述,傳統(tǒng)算法仍有較大缺點(diǎn)。簡單哈希連接算法在處理大數(shù)據(jù)量時(shí),右邊數(shù)據(jù)需要掃描多次,I/O讀取代價(jià)太高;優(yōu)美哈希連接算法在建立子分區(qū)過程時(shí),時(shí)間代價(jià)較大,如果某分區(qū)中的數(shù)據(jù)量依然較大,還需要對該分區(qū)中的數(shù)據(jù)繼續(xù)進(jìn)行哈希處理,使得該分區(qū)可以劃分為更小的分區(qū),如果進(jìn)行多次哈希之后,分區(qū)依然較大,則只能終止哈希處理,采用其他方法進(jìn)行處理,如嵌套循環(huán)連接;混合哈希連接算法雖然結(jié)合了前兩者優(yōu)點(diǎn), 但效率仍然與優(yōu)美哈希連接相當(dāng),并沒有較大提高,只有當(dāng)數(shù)據(jù)能大部分存在放內(nèi)存中時(shí), 效率才有較大提高。
發(fā)明內(nèi)容
本發(fā)明的目的在于提供一種計(jì)算效率高、適用于大數(shù)據(jù)量的哈希連接方法。雖然本發(fā)明主要目的是解決大數(shù)據(jù)量情況下哈希算法效率低的問題,但對小數(shù)據(jù)的情況也同樣適用。本發(fā)明提供的哈希連接方法,是把哈希連接轉(zhuǎn)化為歸并連接(Merge join)進(jìn)行處理,而不是使用常見的優(yōu)美哈希連接算法。具體步驟如下(1)對左邊輸入數(shù)據(jù)(左表數(shù)據(jù))根據(jù)其鍵值(KEY VALUE)進(jìn)行哈希求值,按照得到的哈希值把數(shù)據(jù)插入到哈希表中,如有沖突,哈希值相同的數(shù)據(jù)則按照鍵值進(jìn)行排序插入。當(dāng)內(nèi)存中不能容納所有數(shù)據(jù)即哈希表滿時(shí),需要把所有數(shù)據(jù)刷入磁盤。刷入的方法是根據(jù)哈希表的哈希值即槽號(hào)大小順序地把每個(gè)槽號(hào)里的所有數(shù)據(jù)與該槽號(hào)(nth_cell) 一起組成新的數(shù)據(jù)有序地刷入磁盤,每一次刷入的所有數(shù)據(jù)都當(dāng)作一個(gè)分片。然后把原始數(shù)據(jù)的鍵值(keyl、key2、…、keyn)與槽號(hào)一起組成新的鍵值(keyO (即nth_Cell)、keyl、 key2, -,keyn)0當(dāng)下一批數(shù)據(jù)再來時(shí),進(jìn)行同樣形式的處理,并刷入另一個(gè)分片。依次類推,直至對左邊數(shù)據(jù)處理完畢;這樣每個(gè)分片數(shù)據(jù)都是有序的,然后根據(jù)新的鍵值對左邊所有分片數(shù)據(jù)進(jìn)行排序。本步驟中,為了使發(fā)明具有更好的效果,在進(jìn)行臨時(shí)存儲(chǔ)數(shù)據(jù)時(shí),對原始數(shù)據(jù)進(jìn)行了改造,每條記錄都增加了一列,哈希值(nth_Cell)列,即槽號(hào),然后再刷入磁盤。哈希表中的所有數(shù)據(jù)刷入磁盤的過程,是掃描整個(gè)哈希表,把0號(hào)槽到最后一個(gè)槽中的數(shù)據(jù)依次全部刷入到磁盤,這樣就可以確保刷入的所有數(shù)據(jù)的有序性,這是由于經(jīng)過哈希處理后的數(shù)據(jù)在每個(gè)槽中已經(jīng)是有序的,增加哈希值后,將此哈希值作為一新鍵值,新的數(shù)據(jù)根據(jù)新生成的鍵值(key0、keyl、-,keyn)是有序的,與其他排序方法相比,就省去了對數(shù)據(jù)的排序操作。(2)對右表數(shù)據(jù)也進(jìn)行類似于上述左表數(shù)據(jù)的處理。(3)從左、右邊兩邊分別取出各自分片數(shù)據(jù)中最小的一組分組數(shù)據(jù),根據(jù)新生成的鍵值進(jìn)行大小比較。本步驟中,為了使發(fā)明具有更好的效果,在從分片數(shù)據(jù)中讀取數(shù)據(jù)時(shí),采用了歸并數(shù)據(jù)分片的過程中獲取數(shù)據(jù)的方法,而不是等待數(shù)據(jù)全部歸并完成之后才統(tǒng)一進(jìn)行讀取, 這樣省去了兩次讀寫磁盤操作一次是讀取分片數(shù)據(jù)進(jìn)行排序,一次是把排序后的數(shù)據(jù)再次刷入磁盤,相當(dāng)于在進(jìn)行歸并連接時(shí),數(shù)據(jù)已經(jīng)是部分有序的,節(jié)省時(shí)間,提高處理效率。 在對左、右兩邊數(shù)據(jù)進(jìn)行對比時(shí),新鍵值采用了原來的鍵值加上槽號(hào)的組合方式。因具有槽號(hào),使得數(shù)據(jù)之間的對比也具有更高效率。(4)如果左邊數(shù)據(jù)小于右邊數(shù)據(jù),則根據(jù)哈希連接類型,判斷是否需要輸出左邊數(shù)據(jù),如果是,則輸出左邊數(shù)據(jù),對輸出數(shù)據(jù)的右邊部分用空值填充。否則,不輸出。然后繼續(xù)取出左邊下一組的分組數(shù)據(jù)。如果左邊數(shù)據(jù)大于右邊數(shù)據(jù),則根據(jù)哈希連接類型,判斷是否需要輸出右邊數(shù)據(jù), 如果是,則輸出右邊數(shù)據(jù),對輸出數(shù)據(jù)的左邊部分用空值填充。否則,不輸出。然后繼續(xù)取出右邊下一組的分組數(shù)據(jù)。如果左邊數(shù)據(jù)等于右邊數(shù)據(jù),則根據(jù)哈希連接類型,判斷是否需要輸出數(shù)據(jù),如果是,對兩邊數(shù)據(jù)進(jìn)行笛卡爾積計(jì)算,并輸出笛卡爾積計(jì)算后的數(shù)據(jù)結(jié)果。然后同時(shí)取出左邊與右邊的下一組分組數(shù)據(jù)。(5)反復(fù)執(zhí)行步驟(4),直到左邊或右邊數(shù)據(jù)處理完畢;(6)如果左邊數(shù)據(jù)處理完畢,則根據(jù)哈希連接類型,判斷是否需要輸出左邊數(shù)據(jù), 如果需要,則輸出剩下的左邊數(shù)據(jù),并置輸出數(shù)據(jù)的右邊部分為空值;如果右邊數(shù)據(jù)處理完畢,則根據(jù)哈希連接類型,判斷是否需要輸出右邊數(shù)據(jù),如果需要,則輸出剩下的右邊數(shù)據(jù),并置輸出數(shù)據(jù)的左邊部分為空值;(7)左邊與右邊數(shù)據(jù)都處理完畢,則哈希連接處理完畢。
本發(fā)明中,對哈希連接的處理并不是像普通算法那樣采用優(yōu)美哈希連接算法,而是結(jié)合哈希與排序兩者的思想,把哈希后的數(shù)據(jù)進(jìn)行歸并連接。本發(fā)明中,第一步對數(shù)據(jù)進(jìn)行哈希之后,把每條數(shù)據(jù)在哈希表中的位置(即槽號(hào)),連同數(shù)據(jù)一起存儲(chǔ)在單個(gè)數(shù)據(jù)分片中。每條數(shù)據(jù)所在的哈希表中的位置,與原始數(shù)據(jù)的鍵值一起組成了新的鍵值,然后有序刷入磁盤。哈希表的槽號(hào)作為第一個(gè)對比的鍵值 key,改變了原有數(shù)據(jù)對比的順序。本發(fā)明中,第三步在進(jìn)行鍵值對比時(shí),使用新生成的鍵值(包括槽號(hào))。本發(fā)明的效果在于在對數(shù)據(jù)進(jìn)行哈希后,就已經(jīng)確定了數(shù)據(jù)的順序,從而節(jié)省了數(shù)據(jù)的部分排序操作,當(dāng)把數(shù)據(jù)進(jìn)行歸并操作時(shí),每次都是從N個(gè)分片數(shù)據(jù)中獲取最小的數(shù)據(jù)然后進(jìn)行處理。實(shí)驗(yàn)表明,使用歸并連接實(shí)現(xiàn)的哈希連接方法比優(yōu)美哈希連接方法的速度有較大提高,隨著數(shù)據(jù)量的增加,優(yōu)勢更加明顯。
圖1本發(fā)明運(yùn)用歸并連接實(shí)現(xiàn)GRACE哈希連接方法圖示。圖2記錄插入哈希表。圖3哈希表數(shù)據(jù)刷入磁盤。
具體實(shí)施例方式哈希連接算法中比較常見的算法有簡單哈希連接方法(Simple hash join)、優(yōu)美哈希連接方法(GRACE hash join)和混合哈希連接算法(Hybrid hash join)。盡管許多研究者對這些算法進(jìn)行改進(jìn),但是最終使用的方法還是離不開這些算法的主要思想。本發(fā)明提出的算法,是使用一種歸并連接實(shí)現(xiàn)優(yōu)美哈希連接的思想對哈希連接進(jìn)行處理,與上述三種方法存在較大差異。本發(fā)明所述的使用歸并連接來實(shí)現(xiàn)優(yōu)美哈希連接的方法,具體實(shí)施方式
如下(1)數(shù)據(jù)分片。對左右兩邊數(shù)據(jù)進(jìn)行分片,且分片方式一樣。根據(jù)方法描述,數(shù)據(jù)分片主要步驟涉及到說明書的步驟(1)、(2)和(3)。下面以兩表連接為例詳細(xì)介紹數(shù)據(jù)分片的方法。假設(shè)兩表分別為Tl (Cl INT,C2 INT)和T2(D1 INT, D2 INT);兩表連接的條件為 Cl = Dl ;哈希表大小為N,哈希函數(shù)為H(X)。如果對表Tl進(jìn)行數(shù)據(jù)分片,則根據(jù)方法描述,它的鍵值為(Cl)。根據(jù)本發(fā)明所述, 對Tl表的每條記錄的Cl列值進(jìn)行哈希求值,求出Cl列值的哈希值,即nth_cell = H(Cl), 然后把該記錄插入到哈希表中,插入過程中,保證記錄在哈希槽中有序,如圖2所示。然后一直對Tl表中數(shù)據(jù)記錄進(jìn)行類似處理,直到哈希表滿為止。如果哈希表已滿,則把哈希表中的所有數(shù)據(jù)按照槽號(hào)(nth_Cell值)從小到大的順序刷入磁盤。根據(jù)方法描述,插入過程中,增加了一個(gè)鍵值(KEY),且這些記錄都是按照鍵值(KEY)值(nth_Cell,Cl)有序。把所有數(shù)據(jù)刷入磁盤后,形成了一個(gè)數(shù)據(jù)分片。然后再次取出表Tl的剩下數(shù)據(jù),如此反復(fù),直到數(shù)據(jù)取完。最終形成了所有分片數(shù)據(jù)。如圖1、圖 3所示。T2也按照類似步驟進(jìn)行處理,得到了所有的分片數(shù)據(jù),如圖1、圖3所示。
(2)兩表歸并連接。對已經(jīng)排序好的所有分片數(shù)據(jù)進(jìn)行歸并連接。在進(jìn)行歸并連接時(shí),兩個(gè)表的數(shù)據(jù)分片已經(jīng)是排序的,通過分別對兩個(gè)表的分片數(shù)據(jù)進(jìn)行多路歸并,得到了兩個(gè)表最終有序數(shù)據(jù)。然后進(jìn)行兩表歸并連接。本方法中使用的歸并連接,由于增加了槽號(hào)(nth_Cell)作為鍵值(KEY VALUE), 在進(jìn)行歸并連接時(shí),多增加了一個(gè)對比鍵值,且經(jīng)過刷入分區(qū)數(shù)據(jù)的有序性,比普通歸并連接方法減少了排序操作,且在對比過程中,如果對比的數(shù)據(jù)不是在同一個(gè)哈希表的槽號(hào)中, 則直接就可以跳過同一組數(shù)據(jù)的比較。進(jìn)行歸并連接后就得出了連接的結(jié)果。本發(fā)明最重要的思想在于對左邊和右邊數(shù)據(jù)進(jìn)行分片處理時(shí),增加了哈希表的槽號(hào)并當(dāng)成鍵值,使得每個(gè)分片不需要排序,節(jié)省了大部分的排序時(shí)間。由于每個(gè)分片是有序的,只要對已經(jīng)排好序的數(shù)據(jù)進(jìn)行歸并,然后再按照歸并連接算法進(jìn)行連接即可。因此,歸并過程中,既節(jié)省了對每批數(shù)據(jù)的排序時(shí)間花費(fèi),又節(jié)省了歸并排序的空間花費(fèi)。
權(quán)利要求
1. 一種使用歸并連接來實(shí)現(xiàn)優(yōu)美哈希連接的方法,其特征在于(1)首先對左表數(shù)據(jù)根據(jù)其鍵值進(jìn)行哈希求值,按照哈希值把數(shù)據(jù)插入到哈希表中, 如有沖突,把相同哈希值的數(shù)據(jù)按照鍵值大小進(jìn)行排序插入;如果內(nèi)存中不能容納所有數(shù)據(jù),即哈希表滿,需要把哈希表中的數(shù)據(jù)全部刷入磁盤;刷入的方法是根據(jù)哈希表的哈希值即槽號(hào)從小到大進(jìn)行刷入;把哈希表的每個(gè)槽中的所有數(shù)據(jù)與該槽號(hào)(nth_cell) —起組成新的元組,有序地刷入磁盤,每一次刷入的數(shù)據(jù)作為一個(gè)數(shù)據(jù)分片;然后把原始數(shù)據(jù)的鍵值keyl、key2、…、keyn與槽號(hào)一起組成新的鍵值nth_cell、keyl、key2、…、keyn ;依次對下一批數(shù)據(jù)進(jìn)行同樣形式的處理,并記為下一個(gè)分片;直至對左表數(shù)據(jù)處理完畢;此時(shí), 每個(gè)分片中的數(shù)據(jù)都井然有序,然后再根據(jù)新的鍵值對左邊所有分片中的數(shù)據(jù)進(jìn)行排序;(2)對右表數(shù)據(jù)進(jìn)行與左表數(shù)據(jù)同樣的處理;(3)從左邊、右邊所有分片數(shù)據(jù)中取出最小的一組分組數(shù)據(jù),并根據(jù)新生成的鍵值對這兩組數(shù)據(jù)進(jìn)行大小比較;(4)如果左邊數(shù)據(jù)小于右邊數(shù)據(jù),則根據(jù)哈希連接類型,判斷是否需要輸出左邊數(shù)據(jù); 如果是,則輸出左邊數(shù)據(jù),對輸出數(shù)據(jù)的右邊部分用空值填充;否則不輸出;然后繼續(xù)取出左邊下一組的分組數(shù)據(jù);如果左邊數(shù)據(jù)大于右邊數(shù)據(jù),根據(jù)哈希連接類型,判斷是否需要輸出右邊數(shù)據(jù),如果需要,則輸出右邊數(shù)據(jù),對輸出數(shù)據(jù)的左邊部分用空值填充;否則不輸出; 然后繼續(xù)取出右邊下一組的分組數(shù)據(jù);如果左邊數(shù)據(jù)等于右邊數(shù)據(jù),則對兩邊數(shù)據(jù)進(jìn)行笛卡爾積計(jì)算,并輸出計(jì)算結(jié)果;然后同時(shí)取出左邊與右邊的下一組數(shù)據(jù);(5)反復(fù)執(zhí)行步驟(4),直到左邊或右邊數(shù)據(jù)處理完畢;(6)如果左邊數(shù)據(jù)處理完畢,則根據(jù)哈希連接類型,判斷是否需要輸出左邊數(shù)據(jù),如果需要,則輸出剩下的左邊數(shù)據(jù),并置輸出數(shù)據(jù)的右邊部分為空值;如果右邊數(shù)據(jù)處理完畢,則根據(jù)哈希連接類型,判斷是否需要輸出右邊數(shù)據(jù),如果需要,則輸出剩下的右邊數(shù)據(jù),并置輸出數(shù)據(jù)的左邊部分為空值;(7)左邊與右邊數(shù)據(jù)都處理完畢,則哈希連接處理完畢。
全文摘要
本發(fā)明公開一種在數(shù)據(jù)庫中使用的哈希連接(HASH JOIN)算法,算法采用的方法是通過使用歸并連接來實(shí)現(xiàn)優(yōu)美哈希連接(GRACE HASH JOIN)。該方法巧妙地利用哈希表的槽號(hào)當(dāng)作排序的鍵值,節(jié)省歸并連接所需要的部分排序時(shí)間,結(jié)合哈希思想與歸并排序思想兩者的優(yōu)點(diǎn)。當(dāng)哈希連接的數(shù)據(jù)量過大、內(nèi)存不足以處理時(shí),通過把哈希連接轉(zhuǎn)化成歸并連接(MERGE JOIN)來進(jìn)行處理,可以有效地解決大數(shù)據(jù)量情況下使用哈希算法的低效率問題。
文檔編號(hào)G06F17/30GK102508924SQ20111037511
公開日2012年6月20日 申請日期2011年11月22日 優(yōu)先權(quán)日2011年11月22日
發(fā)明者宋鑫, 汪龍重, 陳福榮 申請人:上海達(dá)夢數(shù)據(jù)庫有限公司