專利名稱:一種面向列存儲的桶內(nèi)索引哈希連接方法
技術(shù)領(lǐng)域:
本發(fā)明涉及一種面向列存儲的桶內(nèi)索引哈希連接方法,適用于基于二元表即〈行號,列值 > 的列存儲數(shù)據(jù)庫管理系統(tǒng)環(huán)境。
背景技術(shù):
連接(Join)在數(shù)據(jù)查詢中占有非常重的比重,特別是在列存儲數(shù)據(jù)系統(tǒng)中尤為重要。除了用戶查詢所需要的連接操作外,為了把各列數(shù)據(jù)重新合并成行,很多情況下就需要額外的同表各列的連接。數(shù)據(jù)庫中的經(jīng)典連接算法有嵌套循環(huán)連接、合并連接和哈希連接等實現(xiàn)方式。其中哈希連接是一種高效的連接算法,多數(shù)情況下其表現(xiàn)均優(yōu)于傳統(tǒng)的嵌套循環(huán)連接和合并連接。然而哈希連接也存在一些缺陷,主要表現(xiàn)在兩個方面。一是難以選擇合適的桶數(shù), 二是難以選擇恰當(dāng)?shù)纳⒘泻瘮?shù)。由于列存儲分析型應(yīng)用中數(shù)據(jù)往往具有“海量特點(diǎn)”,使得桶數(shù)和散列函數(shù)更加難以選擇,上述問題表現(xiàn)更加明顯。首先,若桶數(shù)過少,每個桶內(nèi)的數(shù)據(jù)個數(shù)可能就會太多而致使連接效率低下,而如果桶數(shù)太多則又會造成內(nèi)存浪費(fèi)和管理成本的增加。其次,由于每次哈希連接所處理的數(shù)據(jù)特性都不同,很難找到一個通用的哈希函數(shù)使數(shù)據(jù)都能很好的均勻散列,因此選擇一個通用的哈希散列函數(shù)也十分困難。
發(fā)明內(nèi)容
本發(fā)明的目的是提供一種通過在桶內(nèi)構(gòu)建索引,克服傳統(tǒng)哈希連接的缺陷,減少查找匹配時間,提高哈希連接的效率的哈希連接方法。為了達(dá)到上述目的,本發(fā)明的技術(shù)方案是提供了一種面向列存儲的桶內(nèi)索引哈希連接方法,其特征在于,步驟為步驟I、初始化解析哈希連接兩表信息,確定哈希對象小表S,判斷哈希關(guān)鍵字, 初始化哈希表HT,設(shè)置桶的個數(shù)為B,散列函數(shù)為f(x);步驟2、先創(chuàng)建桶結(jié)點(diǎn),隨后,對哈希對象小表S中數(shù)據(jù)Si使用散列函數(shù)f (x)計算哈希值,再根據(jù)計算的值將數(shù)據(jù)Si按大小有序填充到相應(yīng)的桶結(jié)點(diǎn)適當(dāng)?shù)奈恢弥?,若?shù)據(jù)按哈希關(guān)鍵字無序,桶內(nèi)數(shù)據(jù)采用鏈表存儲,若數(shù)據(jù)按哈希關(guān)鍵字有序,桶內(nèi)數(shù)據(jù)采用數(shù)組存儲,初始情況下僅為每個桶生成一個大小為容忍值長度的數(shù)組,當(dāng)桶內(nèi)的元組個數(shù)超過容忍值T時,再新動態(tài)生成一個容忍值長度的數(shù)組,填充時填充到當(dāng)前數(shù)組尾部;步驟3、判斷當(dāng)前桶內(nèi)的元素個數(shù)是否大于容忍值T,若大于則轉(zhuǎn)向步驟4建立桶內(nèi)索引,否則按照普通的哈希散列算法將其散列到桶中,并轉(zhuǎn)向步驟5 ;步驟4、建立桶內(nèi)索引從第一個數(shù)據(jù)開始,將該數(shù)據(jù)重新插入到桶中,插入第一條數(shù)據(jù)記錄時,建立第一個索引節(jié)點(diǎn),該節(jié)點(diǎn)索引第一條記錄位置,當(dāng)有新的數(shù)據(jù)進(jìn)入該桶時,首先查桶內(nèi)索引鏈,找到合適的索引節(jié)點(diǎn),從此索引節(jié)點(diǎn)索引的的第一個數(shù)據(jù)位置開始對比找到合適位置后插入,若此索引節(jié)點(diǎn)中數(shù)據(jù)個數(shù)count值超過容忍值T時,就從當(dāng)前插入數(shù)據(jù)的位置,將這個索引節(jié)點(diǎn)一分為二,同時為新的索引節(jié)點(diǎn)賦值,該過程反復(fù)進(jìn)行,直到每個索引節(jié)點(diǎn)中數(shù)據(jù)個數(shù)均小于容忍值T ;步驟5、建立桶內(nèi)索引數(shù)組當(dāng)表中所有數(shù)據(jù)插入完成后,將各個桶的索引節(jié)點(diǎn), 按索引數(shù)據(jù)最小值的順序存生成該表的索引數(shù)組,便于二分法查找;步驟6、匹配連接建立上述哈希桶后,利用桶內(nèi)索引,進(jìn)行匹配連接。優(yōu)選地,所述步驟6包括步驟6. I、取哈希大表中數(shù)據(jù)進(jìn)行連接,該數(shù)據(jù)經(jīng)過散列函數(shù)f(x)計算后,找到對應(yīng)的桶;步驟6. 2、首先二分查找此桶對應(yīng)的索引節(jié)點(diǎn)數(shù)組,找到對應(yīng)的索引節(jié)點(diǎn)后,若數(shù)據(jù)按哈希關(guān)鍵字有序,則可取出對應(yīng)的數(shù)組,繼續(xù)使用二分查找;若數(shù)據(jù)按哈希關(guān)鍵字無序,則從索引節(jié)點(diǎn)中讀出此索引節(jié)點(diǎn)中的第一條數(shù)據(jù)的位置,接下來從哈希大表中取出的數(shù)據(jù)就從該位置起依次與桶中數(shù)據(jù)一一比對;步驟6. 3、若遇到相同值則連接成功,并繼續(xù)進(jìn)行比對,到下一個不同的值結(jié)束; 如果沒有遇到相同的值,則比對到下一個索引點(diǎn)的開始數(shù)據(jù)就可以確定小表S中沒有此項,則數(shù)據(jù)連接不成功。本發(fā)明在桶內(nèi)構(gòu)建索引,其好處在于一是不用過分考慮桶的個數(shù)。在桶數(shù)較少的情況下通過桶內(nèi)的索引依然可以快速定位到所需要的元素。二是不用苛求一個適用于多數(shù)數(shù)據(jù)特征的哈希函數(shù),即便哈希函數(shù)選擇不夠合理導(dǎo)致了一定程度上的數(shù)據(jù)分布不均勻, 但是在數(shù)據(jù)分布較多的桶內(nèi)索引又能使系統(tǒng)快速查找到所需元素。特別的,根據(jù)列存儲特點(diǎn),在桶內(nèi)索引基礎(chǔ)上提出哈希行號,在關(guān)鍵字有序數(shù)據(jù)下的散列與匹配算法,進(jìn)一步提升桶內(nèi)查找速度,提高哈希連接效率。本發(fā)明的優(yōu)點(diǎn)是通過在桶內(nèi)構(gòu)建索引,克服傳統(tǒng)哈希連接的缺陷,減少查找匹配時間,提高哈希連接的效率的哈希連接方法。
具體實施例方式為使本發(fā)明更明顯易懂,茲以一優(yōu)選實施例詳細(xì)說明如下。本發(fā)明提供了一種面向列存儲的桶內(nèi)索引哈希連接方法,其步驟為步驟I、初始化解析哈希連接兩表信息,確定哈希對象小表S,判斷哈希關(guān)鍵字, 初始化哈希表HT,設(shè)置桶的個數(shù)為B,散列函數(shù)為f (X),該散列函數(shù)即為哈希函數(shù);步驟2、先創(chuàng)建桶節(jié)點(diǎn),隨后,對哈希對象小表S中數(shù)據(jù)Si使用散列函數(shù)f (X)計算哈希值,再根據(jù)計算的值將數(shù)據(jù)Si按大小有序填充到相應(yīng)的桶結(jié)點(diǎn)適當(dāng)?shù)奈恢弥?,若?shù)據(jù)按哈希關(guān)鍵字無序,桶內(nèi)數(shù)據(jù)采用鏈表存儲,若數(shù)據(jù)按哈希關(guān)鍵字有序,桶內(nèi)數(shù)據(jù)采用數(shù)組存儲,初始情況下僅為每個桶生成一個大小為容忍值長度的數(shù)組,當(dāng)桶內(nèi)的元組個數(shù)超過容忍值T時,再新動態(tài)生成一個容忍值長度的數(shù)組,填充時填充到當(dāng)前數(shù)組尾部;步驟3、判斷當(dāng)前桶內(nèi)的元素個數(shù)是否大于容忍值T,若大于則轉(zhuǎn)向步驟4建立桶內(nèi)索引,否則按照普通的哈希散列算法將其散列到桶中,并轉(zhuǎn)向步驟5 ;步驟4、建立桶內(nèi)索引從第一個數(shù)據(jù)開始,將該數(shù)據(jù)重新插入到桶中,插入第一條數(shù)據(jù)記錄時,建立第一個索引節(jié)點(diǎn),該節(jié)點(diǎn)索引第一條記錄位置,當(dāng)有新的數(shù)據(jù)進(jìn)入該桶時,首先查桶內(nèi)索引鏈,找到合適的索引節(jié)點(diǎn),從此索引節(jié)點(diǎn)索引的的第一個數(shù)據(jù)位置開始對比找到合適位置后插入,若此索引節(jié)點(diǎn)中數(shù)據(jù)個數(shù)count值超過容忍值T時,就從當(dāng)前插入數(shù)據(jù)的位置,將這個索引節(jié)點(diǎn)一分為二,同時為新的索引節(jié)點(diǎn)賦值,該過程反復(fù)進(jìn)行,直到每個索引節(jié)點(diǎn)中數(shù)據(jù)個數(shù)均小于容忍值T ;步驟5、建立桶內(nèi)索引數(shù)組當(dāng)表中所有數(shù)據(jù)插入完成后,將各個桶的索引節(jié)點(diǎn), 按索引數(shù)據(jù)最小值的順序存生成該表的索引數(shù)組,便于二分法查找;步驟6、匹配連接建立上述哈希桶后,利用桶內(nèi)索引,進(jìn)行匹配連接,其步驟包括步驟6. I、取哈希大表中數(shù)據(jù)進(jìn)行連接,該數(shù)據(jù)經(jīng)過散列函數(shù)f(x)計算后,找到對應(yīng)的桶;步驟6. 2、首先二分查找此桶對應(yīng)的索引節(jié)點(diǎn)數(shù)組,找到對應(yīng)的索引節(jié)點(diǎn)后,若數(shù)據(jù)按哈希關(guān)鍵字有序,則可取出對應(yīng)的數(shù)組,繼續(xù)使用二分查找;若數(shù)據(jù)按哈希關(guān)鍵字無序,則從索引節(jié)點(diǎn)中讀出此索引節(jié)點(diǎn)中的第一條數(shù)據(jù)的位置,接下來從哈希大表中取出的數(shù)據(jù)就從該位置起依次與桶中數(shù)據(jù)一一比對;步驟6. 3、若遇到相同值則連接成功,并繼續(xù)進(jìn)行比對,到下一個不同的值結(jié)束; 如果沒有遇到相同的值,則比對到下一個索引點(diǎn)的開始數(shù)據(jù)就可以確定小表S中沒有此項,則數(shù)據(jù)連接不成功。
權(quán)利要求
1.一種面向列存儲的桶內(nèi)索引哈希連接方法,其特征在于,步驟為步驟I、初始化解析哈希連接兩表信息,確定哈希對象小表S,判斷哈希關(guān)鍵字,初始化哈希表HT,設(shè)置桶的個數(shù)為B,散列函數(shù)為f(x);步驟2、先創(chuàng)建桶節(jié)點(diǎn),隨后,對哈希對象小表S中數(shù)據(jù)Si使用散列函數(shù)f(x)計算哈希值,再根據(jù)計算的值將數(shù)據(jù)Si按大小有序填充到相應(yīng)的桶結(jié)點(diǎn)適當(dāng)?shù)奈恢弥校魯?shù)據(jù)按哈希關(guān)鍵字無序,桶內(nèi)數(shù)據(jù)采用鏈表存儲,若數(shù)據(jù)按哈希關(guān)鍵字有序,桶內(nèi)數(shù)據(jù)采用數(shù)組存儲,初始情況下僅為每個桶生成一個大小為容忍值長度的數(shù)組,當(dāng)桶內(nèi)的元組個數(shù)超過容忍值T時,再新動態(tài)生成一個容忍值長度的數(shù)組,填充時填充到當(dāng)前數(shù)組尾部;步驟3、判斷當(dāng)前桶內(nèi)的元素個數(shù)是否大于容忍值T,若大于則轉(zhuǎn)向步驟4建立桶內(nèi)索弓丨,否則按照普通的哈希散列算法將其散列到桶中,并轉(zhuǎn)向步驟5 ;步驟4、建立桶內(nèi)索引從第一個數(shù)據(jù)開始,將該數(shù)據(jù)重新插入到桶中,插入第一條數(shù)據(jù)記錄時,建立第一個索引節(jié)點(diǎn),該節(jié)點(diǎn)索引第一條記錄位置,當(dāng)有新的數(shù)據(jù)進(jìn)入該桶時, 首先查桶內(nèi)索引鏈,找到合適的索引節(jié)點(diǎn),從此索引節(jié)點(diǎn)索引的的第一個數(shù)據(jù)位置開始對比找到合適位置后插入,若此索引節(jié)點(diǎn)中數(shù)據(jù)個數(shù)count值超過容忍值T時,就從當(dāng)前插入數(shù)據(jù)的位置,將這個索引節(jié)點(diǎn)一分為二,同時為新的索引節(jié)點(diǎn)賦值,該過程反復(fù)進(jìn)行,直到每個索引節(jié)點(diǎn)中數(shù)據(jù)個數(shù)均小于容忍值T ;步驟5、建立桶內(nèi)索引數(shù)組當(dāng)表中所有數(shù)據(jù)插入完成后,將各個桶的索引節(jié)點(diǎn),按索引數(shù)據(jù)最小值的順序存生成該表的索引數(shù)組,便于二分法查找;步驟6、匹配連接建立上述哈希桶后,利用桶內(nèi)索引,進(jìn)行匹配連接。
2.如權(quán)利要求I所述的一種面向列存儲的桶內(nèi)索引哈希連接方法,其特征在于,所述步驟6包括步驟6. I、取哈希大表中數(shù)據(jù)進(jìn)行連接,該數(shù)據(jù)經(jīng)過散列函數(shù)f(x)計算后,找到對應(yīng)的桶;步驟6. 2、首先二分查找此桶對應(yīng)的索引節(jié)點(diǎn)數(shù)組,找到對應(yīng)的索引節(jié)點(diǎn)后,若數(shù)據(jù)按哈希關(guān)鍵字有序,則可取出對應(yīng)的數(shù)組,繼續(xù)使用二分查找;若數(shù)據(jù)按哈希關(guān)鍵字無序,則從索引節(jié)點(diǎn)中讀出此索引節(jié)點(diǎn)中的第一條數(shù)據(jù)的位置,接下來從哈希大表中取出的數(shù)據(jù)就從該位置起依次與桶中數(shù)據(jù)一一比對;步驟6. 3、若遇到相同值則連接成功,并繼續(xù)進(jìn)行比對,到下一個不同的值結(jié)束;如果沒有遇到相同的值,則比對到下一個索引點(diǎn)的開始數(shù)據(jù)就可以確定小表S中沒有此項,則數(shù)據(jù)連接不成功。
全文摘要
本發(fā)明涉及一種面向列存儲的桶內(nèi)索引哈希連接方法,其特征在于,步驟為步驟1、初始化;步驟2、將數(shù)據(jù)Si按大小有序填充到相應(yīng)的桶結(jié)點(diǎn)適當(dāng)?shù)奈恢弥?;步驟3、判斷當(dāng)前桶內(nèi)的元素個數(shù)是否大于容忍值T,若大于則轉(zhuǎn)向步驟4建立桶內(nèi)索引,否則按照普通的哈希散列算法將其散列到桶中,并轉(zhuǎn)向步驟5;步驟4、建立桶內(nèi)索引;步驟5、建立桶內(nèi)索引數(shù)組;步驟6、匹配連接。本發(fā)明的優(yōu)點(diǎn)是通過在桶內(nèi)構(gòu)建索引,克服傳統(tǒng)哈希連接的缺陷,減少查找匹配時間,提高哈希連接的效率的哈希連接方法。
文檔編號G06F17/30GK102609487SQ20121001927
公開日2012年7月25日 申請日期2012年1月20日 優(yōu)先權(quán)日2012年1月20日
發(fā)明者樂嘉錦, 夏小玲, 王梅, 郝大騰 申請人:東華大學(xué)