專利名稱:一種面向列存儲dwms的b+樹索引方法
技術(shù)領(lǐng)域:
本發(fā)明涉及一種面向列存儲DWMS (Data Warehouse Management System)的B+樹索引技術(shù)。
背景技術(shù):
互聯(lián)網(wǎng)應(yīng)用的高度發(fā)展,高吞吐量和大存儲量成為現(xiàn)如今數(shù)據(jù)庫產(chǎn)品所必備的特點,對于事務(wù)處理和查詢分析高性能的要求日益迫切。傳統(tǒng)的行存儲數(shù)據(jù)庫并不能像處理事務(wù)應(yīng)用一樣為企業(yè)決策提供高效的查詢分析,近年列存儲的數(shù)據(jù)庫架構(gòu)被重新審視,對于數(shù)據(jù)倉庫中或者分析支持應(yīng)用中讀優(yōu)化的查詢型工作,列存儲表現(xiàn)出比行存儲具有更加顯著的性能。由于關(guān)系表在對外表現(xiàn)上,仍為邏輯行,因此元組重構(gòu)與多表連接是列存儲中影響查詢性能的重要因素。索引是提高查詢效率的重要技術(shù)之一。B+樹索引能夠保持數(shù)據(jù)有序存儲,并具有允許查找、順序存取、插入和刪除的優(yōu)點,使得它在事務(wù)環(huán)境中成為數(shù)據(jù)庫系統(tǒng)使用最廣泛的索引結(jié)構(gòu)。在傳統(tǒng)的數(shù)據(jù)庫系統(tǒng)中,頻繁的數(shù)據(jù)插入和修改帶來的B+樹結(jié)構(gòu)的變化是很大的。為了降低數(shù)據(jù)插入和修改時造成結(jié)點分裂的可能性,B+樹的結(jié)點并不是填滿的。但是在數(shù)據(jù)倉庫系統(tǒng)中,幾乎沒有數(shù)據(jù)插入和修改操作。將傳統(tǒng)B+樹應(yīng)用于海量數(shù)據(jù)存儲的數(shù)據(jù)倉庫系統(tǒng)中將造成空間的浪費。同時,由于結(jié)點并未完全填充,數(shù)據(jù)存儲需要更多的結(jié)點,這將增加B+樹索引的高度,降低數(shù)據(jù)的查詢效率。
發(fā)明內(nèi)容
本發(fā)明的目的是提供一種應(yīng)用于列存儲DWMS的B+樹索引,克服傳統(tǒng)B+樹索引的局限性,提高數(shù)據(jù)的查詢效率。為了達到上述目的,本發(fā)明的技術(shù)方案是提供了一種面向列存儲DWMS的B+樹索引方法,其特征在于,步驟為步驟I、列數(shù)據(jù)生成導(dǎo)入用戶數(shù)據(jù),將原始按行存儲的數(shù)據(jù)垂直劃分為單列,為每一列的每一項數(shù)據(jù)根據(jù)其所在的行號,添加用于元組重建的行號項,形成二元組(行號, 列值),申請數(shù)據(jù)段,將新產(chǎn)生的每列值數(shù)據(jù)保存在一個數(shù)據(jù)段中;步驟2、若B+樹關(guān)鍵字為行號數(shù)據(jù),則轉(zhuǎn)向步驟4進行創(chuàng)建;若B+樹關(guān)鍵字為列值數(shù)據(jù),轉(zhuǎn)步驟3首先對列值進行排序;步驟3、將多路歸并和堆排序組合使用對列值數(shù)據(jù)進行排序;步驟4、B+樹索弓I初始化;步驟5、創(chuàng)建B+樹葉子結(jié)點申請B+樹的葉子結(jié)點,將數(shù)據(jù)項直接填充入葉子結(jié)點得到數(shù)據(jù)塊,構(gòu)成B+樹第O層;步驟5的特點在于根據(jù)列存儲特點,葉子塊中直接保存數(shù)據(jù)信息,而非鍵值與指向數(shù)據(jù)塊的指針。這樣在查找過程中通過葉子結(jié)點可直接獲取數(shù)據(jù),減少一次I/o;結(jié)點填充時不再考慮稀疏系數(shù),樹中的每個結(jié)點都是填滿的,采用了“查找鍵個數(shù)和指針個數(shù)一致”的原則,提升空間利用率。步驟6、產(chǎn)生中間結(jié)點由下至上迭代建立B+樹的中間層結(jié)點直到整棵B+樹創(chuàng)建結(jié)束。優(yōu)選地,所述步驟3包括步驟3. I、初始化在內(nèi)存中申請一個排序區(qū),其大小記為K,令K是塊大小的整數(shù)倍。若待排序數(shù)據(jù)塊數(shù)Blk_num>K,將采用多路歸并外排序的方法。計算多路歸并時M的大小,M為歸并時的子列表個數(shù),令M =「Blk_num/Kl每個待歸并的子列表內(nèi)塊數(shù)D = Blk_ num/Mo步驟3. 2、讀取段中源數(shù)據(jù),把數(shù)據(jù)塊二元組中的列值數(shù)據(jù)拆分出來,裝入 dataitem數(shù)組,放入排序區(qū)。使用堆排序算法將dataitem數(shù)組作為輸入?yún)?shù),對dataitem 數(shù)組進行排序;若Blk_num <= K,則排序結(jié)束;否則,把排好序的數(shù)據(jù)項重新組裝成塊,寫回臨時段中。步驟3. 3、對M個臨時段進行歸并排序。優(yōu)選地,所述步驟6包括步驟6. I、生成索引項,索引項為由下一層塊中的第一個列值、對應(yīng)的行號以及該塊的塊號構(gòu)成的三元組;步驟6. 2、判斷列值類型是定長數(shù)據(jù)或變長數(shù)據(jù),若是定長列值,計算得到索引項的長度,進而可得索引塊中的索引項個數(shù)=索引塊空間大小/索引項長度,第一層中的索弓I塊個數(shù)=第O層中的數(shù)據(jù)塊個數(shù)/每個結(jié)點中的索引項個數(shù)。申請索引塊空間,將索引項批量插入到索引塊中;若是變長列值,先申請一個索引塊,然后依次插入三元組,直到放不下時才申請新的索引塊;步驟6. 3、一層創(chuàng)建完成后,轉(zhuǎn)向步驟5. 1,按照同樣的過程創(chuàng)建上一層中間結(jié)點, 直到整棵B+樹創(chuàng)建結(jié)束。本發(fā)明提供一種應(yīng)用于列存儲DWMS的B+樹索引具有如下優(yōu)點I)提供改進的B+樹索引結(jié)點,葉子結(jié)點直接存儲列數(shù)據(jù),中間結(jié)點不再考慮稀疏系數(shù),全部填滿,增加了空間利用率。對于相同個數(shù)的數(shù)據(jù),該結(jié)構(gòu)保證B樹層次最短,減少了查找次數(shù);2)B+樹的建立拋棄了傳統(tǒng)的插入法,使用自底向上構(gòu)造B+樹的方法。使用這種方法不需要考慮分裂操作,減少了大量的開銷;3)對列存儲系統(tǒng)中行號和列值數(shù)據(jù)分別建立B+樹索引,保持數(shù)據(jù)有序存儲,便于元組重構(gòu)與多表連接。
圖I為B+樹內(nèi)部結(jié)點(索引項)的結(jié)構(gòu);圖2為B+樹葉結(jié)點(數(shù)據(jù)頁)的結(jié)構(gòu)。
具體實施例方式為使本發(fā)明更明顯易懂,茲以一優(yōu)選實施例詳細說明如下。
本發(fā)明提供了一種面向列存儲DWMS的B+樹索引方法,其步驟為步驟I、列數(shù)據(jù)生成導(dǎo)入用戶數(shù)據(jù),將原始按行存儲的數(shù)據(jù)垂直劃分為單列,為每一列的每一項數(shù)據(jù)根據(jù)其所在的行號,添加用于元組重建的行號項,形成二元組(行號, 列值),申請數(shù)據(jù)段,將新產(chǎn)生的每列值數(shù)據(jù)保存在一個數(shù)據(jù)段中;步驟2、若B+樹關(guān)鍵字為行號數(shù)據(jù),則轉(zhuǎn)向步驟4進行創(chuàng)建;若B+樹關(guān)鍵字為列值數(shù)據(jù),轉(zhuǎn)步驟3首先對列值進行排序;步驟3、將多路歸并和堆排序組合使用對列值數(shù)據(jù)進行鍵值排序,本步驟包括步驟3. I、初始化在內(nèi)存中申請一個排序區(qū),其大小記為K,令K是塊大小的整數(shù)倍。若待排序數(shù)據(jù)塊數(shù)Blk_num>K,將采用多路歸并外排序的方法。計算多路歸并時M的大小,M為歸并時的子列表個數(shù),令M =「Blk_num /Kl每個待歸并的子列表內(nèi)塊數(shù)D = Blk_ num/Mo步驟3. 2、讀取段中源數(shù)據(jù),把數(shù)據(jù)塊二元組中的列值數(shù)據(jù)拆分出來,裝入 dataitem數(shù)組,放入排序區(qū)。使用堆排序算法將dataitem數(shù)組作為輸入?yún)?shù),對dataitem 數(shù)組進行排序;若Blk_num <= K,則排序結(jié)束;否則,把排好序的數(shù)據(jù)項重新組裝成塊,寫回臨時段中。步驟3. 3、對M個臨時段進行歸并排序。步驟4、B+樹初始化,具體包括對B+樹的描述信息進行賦值,需要賦值的內(nèi)容如下(I)B+樹索引鍵值的類型,包括定/變長、是否數(shù)值類型。定長的鍵值類型包括: SMALLINT、INT、NUMBER、CHAR、DATE、TIME ;變長的鍵值類型有包括 VARCHAR。(2)列的信息,包括列名、列類型、列長,如果列是變長,則指定最大長度。(3)為B+樹根塊分配空間。(4)設(shè)置B+樹的level值為O。步驟5、創(chuàng)建葉子結(jié)點申請B+樹的葉子結(jié)點,將數(shù)據(jù)項直接填充入葉子結(jié)點得到數(shù)據(jù)塊,構(gòu)成B+樹第O層;本步驟根據(jù)列存儲特點,葉子塊中直接保存數(shù)據(jù)信息,而非鍵值與指向數(shù)據(jù)塊的指針。這樣在查找過程中通過葉子結(jié)點可直接獲取數(shù)據(jù),減少一次I/O。 此外,結(jié)點填充時不再考慮稀疏系數(shù),樹中的每個結(jié)點都是填滿的,提升空間利用率,如圖I 及圖2所示。圖中的KEYi由<行號,列值>兩部分組成。步驟6、產(chǎn)生中間結(jié)點由下至上迭代建立B+樹的中間層結(jié)點直到整棵B+樹創(chuàng)建結(jié)束,其步驟為步驟6. I、生成索引項,索引項由下一層塊中的第一個列值、對應(yīng)的行號以及該塊的塊號構(gòu)成的三元組,計算索引項的長度,記為TL ;步驟6. 2、申請索引塊空間根據(jù)步驟4中初始化信息判斷列值是定長或變長的, 若是定長列值,計算得到索引項的長度。索引塊中的索引項個數(shù)=每個索引塊空間大小/ 索引項長度TL。計算第一層中的索引塊個數(shù)=第O層中的數(shù)據(jù)塊個數(shù)/每個索引塊中的索引項個數(shù)。申請該層的索引塊空間。將索引項批量插入到索引塊中;若是變長列值,先申請一個索引塊,然后依次插入三元組,直到放不下時才申請新的索引塊。步驟6. 3、一層創(chuàng)建完成后,level = level+1 ;轉(zhuǎn)向步驟6. I,按照同樣的過程創(chuàng)建上一層中間結(jié)點,不同之處在于計算當前層的索引塊個數(shù)=下一層的索引塊個數(shù)/每個索引塊中的索引項個數(shù)。當該層中的索引塊個數(shù)為I時,迭代結(jié)束,該索引塊即為B+樹的根結(jié)點。
權(quán)利要求
1.一種面向列存儲DWMS的B+樹索引方法,其特征在于,步驟為步驟I、列數(shù)據(jù)生成導(dǎo)入用戶數(shù)據(jù),將原始按行存儲的數(shù)據(jù)垂直劃分為單列,為每一列的每一項數(shù)據(jù)根據(jù)其所在的行號,添加用于元組重建的行號項,形成二元組(行號,列值),申請數(shù)據(jù)段,將新產(chǎn)生的每列值數(shù)據(jù)保存在一個數(shù)據(jù)段中;步驟2、若B+樹關(guān)鍵字為行號數(shù)據(jù),則轉(zhuǎn)向步驟4進行創(chuàng)建;若B+樹關(guān)鍵字為列值數(shù)據(jù),轉(zhuǎn)步驟3首先對列值進行排序;步驟3、將多路歸并和堆排序組合使用對列值數(shù)據(jù)進行排序;步驟4、B+樹索引初始化;步驟5、創(chuàng)建B+樹葉子結(jié)點申請B+樹的葉子結(jié)點,將數(shù)據(jù)項直接填充入葉子結(jié)點得到數(shù)據(jù)塊,構(gòu)成B+樹第O層;步驟6、產(chǎn)生中間結(jié)點由下至上迭代建立B+樹的中間層結(jié)點直到整棵B+樹創(chuàng)建結(jié)束。
2.如權(quán)利要求I所述的一種面向列存儲DWMS的B+樹索引方法,其特征在于,所述步驟 3包括步驟3. I、初始化在內(nèi)存中申請一個排序區(qū),其大小記為K,令K是塊大小的整數(shù)倍。若待排序數(shù)據(jù)塊數(shù)Blk_num > K,將采用多路歸并外排序的方法。計算多路歸并時M的大小,M 為歸并時的子列表個數(shù),令M =「Blk—num / Kl每個待歸并的子列表內(nèi)塊數(shù)D = Blk_num/M ;步驟3. 2、讀取段中源數(shù)據(jù),把數(shù)據(jù)塊二元組中的列值數(shù)據(jù)拆分出來,裝入dataitem數(shù)組,放入排序區(qū)。使用堆排序算法將dataitem數(shù)組作為輸入?yún)?shù),對dataitem數(shù)組進行排序;SBlk_num<= K,則排序結(jié)束;否則,把排好序的數(shù)據(jù)項重新組裝成塊,寫回臨時段中;步驟3. 3、對M個臨時段進行歸并排序。
3.如權(quán)利要求I所述的一種面向列存儲DWMS的B+樹索引方法,其特征在于,所述步驟 6包括步驟6. I、生成索引項,索引項為由下一層塊中的第一個列值、對應(yīng)的行號以及該塊的塊號構(gòu)成的三元組;步驟6. 2、判斷列值類型是定長數(shù)據(jù)或變長數(shù)據(jù),若是定長列值,計算得到索引項的長度,進而可得索引塊中的索引項個數(shù)=索引塊空間大小/索引項長度,第一層中的索引塊個數(shù)=第O層中的數(shù)據(jù)塊個數(shù)/每個結(jié)點中的索引項個數(shù)。申請索弓I塊空間,將索弓I項批量插入到索引塊中;若是變長列值,先申請一個索引塊,然后依次插入三元組,直到放不下時才申請新的索引塊;步驟6. 3、一層創(chuàng)建完成后,轉(zhuǎn)向步驟5. 1,按照同樣的過程創(chuàng)建上一層中間結(jié)點,直到整棵B+樹創(chuàng)建結(jié)束。
全文摘要
本發(fā)明涉及一種面向列存儲DWMS的B+樹索引方法,其特征在于,步驟為步驟1、列數(shù)據(jù)生成;步驟2、若B+樹關(guān)鍵字為行號,則轉(zhuǎn)向步驟4進行創(chuàng)建,否則轉(zhuǎn)步驟3進行排序;步驟3、將多路歸并和堆排序組合使用對列值數(shù)據(jù)進行排序;步驟4、B+樹索引初始化;步驟5、創(chuàng)建葉子結(jié)點;步驟6、自底向上產(chǎn)生中間結(jié)點。本發(fā)明提供一種應(yīng)用于列存儲DWMS的B+樹索引具有如下優(yōu)點1)保證B樹層次最短,減少了查找次數(shù);2)B+樹的建立拋棄了傳統(tǒng)的插入法,使用自底向上構(gòu)造B+樹的方法。使用這種方法不需要考慮分裂操作,減少了大量的開銷。
文檔編號G06F17/30GK102609490SQ20121001993
公開日2012年7月25日 申請日期2012年1月20日 優(yōu)先權(quán)日2012年1月20日
發(fā)明者樂嘉錦, 夏小玲, 李曄鋒, 王梅 申請人:東華大學(xué)