或說(shuō)明性”。這里作為“示例性”所說(shuō)明的任何實(shí)施例不必解釋為優(yōu)于或好于其它實(shí)施例。
[0050]另外,為了更好的說(shuō)明本發(fā)明,在下文的【具體實(shí)施方式】中給出了眾多的具體細(xì)節(jié)。本領(lǐng)域技術(shù)人員應(yīng)當(dāng)理解,沒(méi)有某些具體細(xì)節(jié),本發(fā)明同樣可以實(shí)施。在一些實(shí)例中,對(duì)于本領(lǐng)域技術(shù)人員熟知的方法、手段、元件和電路未作詳細(xì)描述,以便于凸顯本發(fā)明的主旨。
[0051]如【背景技術(shù)】和
【發(fā)明內(nèi)容】
所述,哈希連接算法是利用哈希表實(shí)現(xiàn)連接。哈希連接算法主要包括構(gòu)建表(build table)和探測(cè)表(probe table)。數(shù)據(jù)庫(kù)的表中的數(shù)據(jù)一般是按照某種預(yù)定的規(guī)則存儲(chǔ),如按元組存儲(chǔ)。在兩個(gè)要進(jìn)行連接的表中,選取元組較少的一個(gè),將其中的元組采用某個(gè)哈希函數(shù)和某種沖突解決方法,構(gòu)建哈希表,簡(jiǎn)稱(chēng)構(gòu)建表。取兩個(gè)表中元組較多的一個(gè),稱(chēng)為探測(cè)表,用其中的每一個(gè)元組到構(gòu)建表中進(jìn)行哈希查找,找到能夠進(jìn)行連接的元組。如果做查找的兩個(gè)元組滿(mǎn)足連接條件,則將它們連接或輸出。需要說(shuō)明的是,探測(cè)表對(duì)其每個(gè)元組采用的哈希函數(shù)和沖突解決方法分別與構(gòu)建表對(duì)其元組采用的哈希函數(shù)和沖突解決方法相同。以上就是哈希連接算法的基本原理。
[0052]在構(gòu)建表建立過(guò)程中,一般采用哈希桶(Hash Bucket)解決沖突。即為每個(gè)哈希值,建立一個(gè)哈希桶,桶的容量是固定的,也就是只能處理固定次數(shù)的沖突,如1048576個(gè)哈希桶,每個(gè)桶中有4個(gè)表項(xiàng)(Entry),總計(jì)4M (兆)個(gè)表項(xiàng)。這種實(shí)現(xiàn)思路和通常的鏈地址法雷同,就是對(duì)哈希表中每個(gè)哈希值建立一個(gè)沖突表,即將沖突的幾個(gè)記錄以表的形式存儲(chǔ)在哈希桶中。
[0053]本申請(qǐng)針對(duì)現(xiàn)有數(shù)據(jù)庫(kù)系統(tǒng)中采用的哈希連接算法CPU cache命中率不高,從而導(dǎo)致查詢(xún)效率低下的問(wèn)題,提出了一種探測(cè)表數(shù)據(jù)處理方法,它的中心思想是將探測(cè)表中的數(shù)據(jù)在進(jìn)行哈希連接之前按照其哈希值重新組織,而不是隨機(jī)分布,并寫(xiě)入磁盤(pán)。從而使得在后續(xù)利用哈希連接算法進(jìn)行查詢(xún)時(shí),把探測(cè)表中數(shù)據(jù)按預(yù)定的規(guī)則逐個(gè)在哈希表中查找匹配,將探測(cè)表中的數(shù)據(jù)與構(gòu)建表中所查找匹配到的數(shù)據(jù)進(jìn)行連接。這樣,能夠讓哈希表中相同哈希值的區(qū)域連續(xù)訪(fǎng)問(wèn),從而大大提高了 CPU cache命中率。本申請(qǐng)的具體實(shí)現(xiàn)流程詳見(jiàn)下面實(shí)施例的闡述。
[0054]實(shí)施例1
[0055]圖1示出根據(jù)本發(fā)明一實(shí)施例的數(shù)據(jù)處理方法的流程圖。如圖1所示,該方法主要可以包括:
[0056]步驟S100、將對(duì)應(yīng)于探測(cè)表的數(shù)據(jù)分別進(jìn)行哈希計(jì)算,得到哈希值,根據(jù)所得到的哈希值,將所述數(shù)據(jù)進(jìn)行重組并存儲(chǔ)到所述探測(cè)表中,其中,所述探測(cè)表為欲進(jìn)行哈希連接中的兩個(gè)表中數(shù)據(jù)較多的表;
[0057]步驟S110、利用哈希連接算法將所述探測(cè)表中的數(shù)據(jù)與構(gòu)建表中的數(shù)據(jù)進(jìn)行連接,其中,所述構(gòu)建表為欲進(jìn)行哈希連接中的兩個(gè)表中數(shù)據(jù)較少的表。
[0058]對(duì)于上述步驟S100,在利用哈希連接算法對(duì)探測(cè)表和構(gòu)建表進(jìn)行連接時(shí),首先需要將對(duì)應(yīng)于探測(cè)表的數(shù)據(jù)按與構(gòu)建表中數(shù)據(jù)相同的哈希函數(shù)和解決沖突的方法進(jìn)行重組。具體為將對(duì)應(yīng)于探測(cè)表的數(shù)據(jù)分別進(jìn)行哈希計(jì)算,得到哈希值,這時(shí),可以將所計(jì)算出的哈希值進(jìn)行存儲(chǔ)。然后根據(jù)計(jì)算得到的數(shù)據(jù)的哈希值,將探測(cè)表中的數(shù)據(jù)進(jìn)行重組即聚簇,并將重組后的數(shù)據(jù)重新存儲(chǔ)到探測(cè)表中。其中,所述探測(cè)表為欲進(jìn)行哈希連接中的兩個(gè)表中數(shù)據(jù)較多的表;所述構(gòu)建表為欲進(jìn)行哈希連接中的兩個(gè)表中數(shù)據(jù)較少的表。
[0059]需要說(shuō)明的是,上述步驟SlOO中,如果重組操作發(fā)生在在探測(cè)表數(shù)據(jù)存入數(shù)據(jù)庫(kù)的時(shí)候,則對(duì)應(yīng)于探測(cè)表的數(shù)據(jù),指的是待存入探測(cè)表中的數(shù)據(jù)。即,在一種可能的實(shí)現(xiàn)方式中,步驟SlOO具體可以包括:在所述探測(cè)表中的數(shù)據(jù)存入數(shù)據(jù)庫(kù)時(shí),對(duì)待存入探測(cè)表中的數(shù)據(jù)分別進(jìn)行哈希計(jì)算,得到哈希值,根據(jù)所得到的哈希值,將所述數(shù)據(jù)進(jìn)行重組并存儲(chǔ)到所述探測(cè)表中。
[0060]如果重組操作發(fā)生在該探測(cè)表首次需要進(jìn)行哈希連接時(shí),則對(duì)應(yīng)于探測(cè)表的數(shù)據(jù)指的是對(duì)已經(jīng)存入探測(cè)表中的數(shù)據(jù)。即,在一種可能的實(shí)現(xiàn)方式中,步驟SlOO具體可以包括:在所述探測(cè)表首次進(jìn)行哈希連接時(shí),對(duì)探測(cè)表中的數(shù)據(jù)分別進(jìn)行哈希計(jì)算,得到哈希值,根據(jù)所得到的哈希值,將所述數(shù)據(jù)進(jìn)行重組并存儲(chǔ)到所述探測(cè)表中。
[0061]對(duì)于上述步驟S110,將對(duì)應(yīng)于探測(cè)表的數(shù)據(jù)按照計(jì)算得到的哈希值重組后,就可以利用哈希連接算法將所述探測(cè)表中的數(shù)據(jù)與構(gòu)建表中的數(shù)據(jù)進(jìn)行連接。
[0062]現(xiàn)有技術(shù)中,探測(cè)表中數(shù)據(jù)的哈希值通常是隨機(jī)分布的,相鄰數(shù)據(jù)的哈希值可能相差很大,這樣,按存儲(chǔ)順序?qū)μ綔y(cè)表中的每個(gè)元組在其對(duì)應(yīng)的構(gòu)建表上按照預(yù)定的規(guī)則如數(shù)據(jù)值相等查找匹配,將探測(cè)表中的數(shù)據(jù)與構(gòu)建表中所查找匹配到的數(shù)據(jù)進(jìn)行連接。由于相鄰元組在構(gòu)建表中對(duì)應(yīng)的哈希值很可能相差很多,相當(dāng)于是對(duì)構(gòu)建表的隨機(jī)訪(fǎng)問(wèn),因此,哈希連接算法可能導(dǎo)致CPU cache命中率較低。由于CPU cache容量較小,只緩存最近使用過(guò)的數(shù)據(jù),因此,這種對(duì)構(gòu)建表的隨機(jī)訪(fǎng)問(wèn)難以直接命中CPU cache緩存的數(shù)據(jù),導(dǎo)致查詢(xún)效率較低。通過(guò)本發(fā)明實(shí)施例提供的數(shù)據(jù)處理方法,首先將探測(cè)表中的數(shù)據(jù)按照計(jì)算得到的哈希值進(jìn)行重組,而不是隨機(jī)分布,從而使得在利用哈希連接算法進(jìn)行查詢(xún)時(shí),把探測(cè)表中數(shù)據(jù)按順序逐個(gè)在哈希表中按照預(yù)定的規(guī)則查找匹配,將探測(cè)表中的數(shù)據(jù)與構(gòu)建表中所查找匹配到的數(shù)據(jù)進(jìn)行連接。這樣,能夠讓哈希表中相同哈希值的區(qū)域連續(xù)訪(fǎng)問(wèn),提高了 CPU cache命中率,從而提高了查詢(xún)效率。
[0063]實(shí)施例2
[0064]圖2示出根據(jù)本發(fā)明另一實(shí)施例的數(shù)據(jù)處理方法的流程圖。圖2中標(biāo)號(hào)與圖1相同的步驟具有相同的功能,為簡(jiǎn)明起見(jiàn),省略對(duì)這些步驟的詳細(xì)說(shuō)明。
[0065]如圖2所示,圖2所示的數(shù)據(jù)處理方法與圖1所示數(shù)據(jù)處理方法的主要區(qū)別在于,上述步驟SlOO具體可以包括以下步驟:
[0066]步驟S1001、將對(duì)應(yīng)于探測(cè)表的數(shù)據(jù)分別進(jìn)行哈希計(jì)算,得到哈希值,根據(jù)對(duì)所述數(shù)據(jù)計(jì)算得到的哈希值,將哈希值相同的所述數(shù)據(jù)在所述探測(cè)表中相鄰存儲(chǔ)。
[0067]具體地,例如在探測(cè)表的數(shù)據(jù)存儲(chǔ)數(shù)據(jù)庫(kù)時(shí)對(duì)上述隨機(jī)分布的數(shù)據(jù)按照哈希連接中使用的哈希函數(shù)進(jìn)行重新組織,構(gòu)建內(nèi)存哈希表。通??梢岳霉M皝?lái)存儲(chǔ)哈希值相同的數(shù)據(jù)。如果探測(cè)表較大,導(dǎo)致內(nèi)存用完,即將同一個(gè)哈希桶的數(shù)據(jù)寫(xiě)到磁盤(pán),并釋放內(nèi)存空間。這樣,探測(cè)表將按哈希值重組,哈希值相同的元組相鄰存儲(chǔ)。具體過(guò)程如下:首先,在順序?qū)⑻綔y(cè)表中的數(shù)據(jù)掃描存入數(shù)據(jù)庫(kù)時(shí),計(jì)算探測(cè)表中的數(shù)據(jù)的哈希值,根據(jù)哈希值將數(shù)據(jù)插入相應(yīng)的哈希桶。若內(nèi)存滿(mǎn),則將已經(jīng)裝滿(mǎn)的哈希桶寫(xiě)入磁盤(pán)。繼續(xù)掃描,直到所有需要存入數(shù)據(jù)庫(kù)中的數(shù)據(jù)都處理完畢,將內(nèi)存哈希表中剩下的哈希桶寫(xiě)入磁盤(pán)。
[0068]在一種可能的實(shí)現(xiàn)方式中,上述步驟SllO具體可以包括以下步驟:
[0069]步驟S1101、將所述探測(cè)表中的數(shù)據(jù)按存儲(chǔ)順序計(jì)算哈希值;
[0070]步驟S1102、根據(jù)所計(jì)算出的哈希值,按照預(yù)定的規(guī)則在所述構(gòu)建表中查找匹配;
[0071]步驟S1103、將所述探測(cè)表中的數(shù)據(jù)與所述構(gòu)建表中所查找匹配到的數(shù)據(jù)進(jìn)行連接。
[0072]具體地,如果在步驟SlOO中未對(duì)計(jì)算出的哈希值進(jìn)行存儲(chǔ),在進(jìn)行連接時(shí),則可以首先對(duì)計(jì)算探測(cè)表中的數(shù)據(jù)的哈希值;然后根據(jù)所述計(jì)算出的哈希值對(duì)探測(cè)表中的數(shù)據(jù)以存儲(chǔ)順序按照預(yù)定的規(guī)則如數(shù)據(jù)值相等時(shí)連接逐個(gè)在構(gòu)建表中查找匹配;最后,將所述探測(cè)表中的數(shù)據(jù)與所述構(gòu)建表中所查找匹配到的數(shù)據(jù)進(jìn)行連接。如果步驟SlOO中已經(jīng)將計(jì)算出的哈希值進(jìn)行過(guò)存儲(chǔ),則步驟Sl1只需根據(jù)所存儲(chǔ)的哈希值,將所述探測(cè)表中的數(shù)據(jù)以存儲(chǔ)順序按照預(yù)定的規(guī)則在所述構(gòu)建表中查找匹配;將所述探測(cè)表中的數(shù)據(jù)與所述構(gòu)建表中所查找匹配到的數(shù)據(jù)進(jìn)行連接。
[0073]由于探測(cè)表已按照哈希值重新組織,相鄰的數(shù)據(jù)的哈希值相同,因此可以重復(fù)命中構(gòu)建表中的相應(yīng)值,這樣可以提高哈希連接的查詢(xún)效率。
[0074]圖3示出根據(jù)本發(fā)明一實(shí)施例的數(shù)據(jù)重組方法的應(yīng)用場(chǎng)景示意圖。如圖3所示,假設(shè)在integer (整數(shù))類(lèi)型數(shù)據(jù)上進(jìn)行哈希連接,哈希函數(shù)為按10取模。構(gòu)建表的數(shù)據(jù)在初始狀態(tài)下的順序和哈希值沒(méi)有對(duì)應(yīng)。具體數(shù)據(jù)如圖3中原始數(shù)據(jù)列所示。按照本發(fā)明實(shí)施例提出的數(shù)據(jù)處理方法,在一種可能的實(shí)現(xiàn)方式中,可以在這批數(shù)據(jù)存入數(shù)據(jù)庫(kù)時(shí),按