亚洲狠狠干,亚洲国产福利精品一区二区,国产八区,激情文学亚洲色图

基于哈希的聚簇表存儲方法

文檔序號:6439799閱讀:328來源:國知局
專利名稱:基于哈希的聚簇表存儲方法
技術領域
本發(fā)明涉及一種數(shù)據(jù)庫存儲方法,尤其涉及一種面向數(shù)據(jù)庫存儲管理的需要,基于哈希(hash)的聚簇表存儲方法,屬于數(shù)據(jù)庫存儲技術領域。
背景技術
數(shù)據(jù)庫(Database)是依照某種數(shù)據(jù)模型組織起來并存放二級存儲器中的數(shù)據(jù)集合。在數(shù)據(jù)庫技術中,可以使用兩種形式描述客觀現(xiàn)實的數(shù)據(jù)物理數(shù)據(jù)描述和邏輯數(shù)據(jù)描述。物理數(shù)據(jù)描述是指數(shù)據(jù)在存儲設備上的存儲方式,物理數(shù)據(jù)是實際存放在存儲設備上的數(shù)據(jù),這些數(shù)據(jù)也稱為物理記錄。邏輯數(shù)據(jù)描述是指用戶或程序員用于操作的數(shù)據(jù)形式,邏輯數(shù)據(jù)是一種抽象的概念,是對客觀現(xiàn)實世界的反映和記錄,這些數(shù)據(jù)也可以稱為邏輯記錄。物理數(shù)據(jù)和邏輯數(shù)據(jù)之間的轉(zhuǎn)換通過數(shù)據(jù)庫管理系統(tǒng)實現(xiàn)。在數(shù)據(jù)庫管理系統(tǒng)中,采用字段來標記實體屬性的可以命名的最小信息單位。字段的集合稱為元組。一個元組表示一個具體的實體。在現(xiàn)有的關系型數(shù)據(jù)庫中,往往將一個數(shù)據(jù)表中的行作為元組,列作為字段。一個數(shù)據(jù)表由行(元組)和列(字段)構(gòu)成,組成一個二維關系表。若干個數(shù)據(jù)表、視圖及相關的文件等組成一個統(tǒng)一的相關聯(lián)的數(shù)據(jù)庫系統(tǒng)。在數(shù)據(jù)庫系統(tǒng)中,索引是對數(shù)據(jù)表中一列或多列的值進行排序的一種結(jié)構(gòu),使用索引可以快速訪問數(shù)據(jù)表中的特定信息。索引分為聚簇索引和非聚簇索引兩種。所謂聚簇是指為了提高某個字段(或字段組)的查詢速度,將這些字段上具有相同值的元組集中存放在連續(xù)的物理塊中。因此,聚簇索引能夠提高多行檢索的速度,而非聚簇索引適合于單行的檢索。哈希聚簇(hash cluster)是指通過預先分配空間的方式,將相同關鍵字(key)的數(shù)據(jù)存放在一起,以提高查詢性能的一項技術。目前,僅僅在Oracle系列數(shù)據(jù)庫產(chǎn)品有哈希聚簇功能,其它的數(shù)據(jù)庫產(chǎn)品,例如SQL Server, IBM DB2以及達夢DM等中均沒有類似功能。在實際使用中,該項技術仍然存在一定的缺陷,例如關鍵字(key)的數(shù)量難以精確估計,造成哈希聚簇技術的應用場景非常有限。

發(fā)明內(nèi)容
鑒于現(xiàn)有技術所存在的不足,本發(fā)明所要解決的技術問題在于提供一種基于哈希的聚簇表存儲方法。該方法能夠提供跨過索引直達元組的數(shù)據(jù)庫存儲管理機制。為實現(xiàn)上述的發(fā)明目的,本發(fā)明采用下述的技術方案一種基于哈希的聚簇表存儲方法,所述數(shù)據(jù)表由元組和列構(gòu)成,其特征在于包括以下步驟步驟1 預先初始化空的數(shù)據(jù)表頁面空間;步驟2 指定所述數(shù)據(jù)表的一個或多個列為哈希列;步驟3 根據(jù)各個元組的所述哈希列的值來計算哈希值,作為相應元組的存儲位
3置;步驟4 根據(jù)所述哈希值映射出所述相應元組在所述頁面空間上的行指針;步驟5 根據(jù)所述行指針,將所述相應元組插入到所述頁面空間。其中較優(yōu)地,根據(jù)可能用到的元組的、哈希列的哈希值的個數(shù),對所述頁面空間進行動態(tài)預分配。其中較優(yōu)地,在所述步驟3中,當各個元組的哈希列的哈希值中出現(xiàn)兩個或多個哈希值相同時,對相應的哈希值增加溢出鏈,將該元組存儲到溢出鏈中。其中較優(yōu)地,還包括對所述聚簇表的查詢步驟根據(jù)指定的哈希列的值計算出相應的哈希值,通過所述哈希值按照已建立的映射關系找到行指針,根據(jù)所述行指針找到相應的元組。其中較優(yōu)地,當所述聚簇表是非獨特類型聚簇表時,所述查詢步驟還包括對查詢得到的、符合行指針的多條元組的哈希列的值進行驗證。其中較優(yōu)地,當所述聚簇表是獨特類型聚簇表時,對查詢得到的符合行指針的多條元組的哈希列的值,不進行驗證。其中較優(yōu)地,如果在查詢過程后面有插入操作,那么還包括動態(tài)擴充聚簇表的頁面空間的步驟獲得需要插入的元組的哈希列的值,然后計算出哈希值,并通過一對一的映射得到所述需要插入的元組存儲在頁面上的行指針,然后根據(jù)所述行指針找到對應的頁面進行插入。其中較優(yōu)地,如果所述行指針找到的頁面的頁面空間不夠,則將所述需要插入的元組存儲在溢出鏈中。其中較優(yōu)地,如果查詢列包括所述數(shù)據(jù)表的所有哈希列,或者使用特定哈希函數(shù)時的查詢列為哈希列的前綴以及排序操作,使用聚簇掃描方式進行掃描。本發(fā)明所提供的聚簇表存儲方法對現(xiàn)有哈希聚簇技術做了進一步改進,可以實現(xiàn)跨過索引直達元組的數(shù)據(jù)庫存儲管理機制,從而在大規(guī)模數(shù)據(jù)庫系統(tǒng)的使用過程中避免了索引對緩存資源的大量占用,改善了數(shù)據(jù)庫系統(tǒng)的使用性能。


下面結(jié)合附圖和具體實施方式
對本發(fā)明做進一步的詳細說明。圖1為通過哈希聚簇表獲取數(shù)據(jù)表中元組的示意圖。
具體實施例方式在大規(guī)模數(shù)據(jù)庫系統(tǒng)的使用過程中,使用索引進行掃描時索引本身將會占用大量的緩存資源,從而降低了緩存資源的利用率。為了解決這一問題,需要實現(xiàn)能夠跨過索引直達元組的數(shù)據(jù)庫存儲管理機制。為此,本發(fā)明所提供的聚簇表存儲方法首先建立通過元組列的哈希值(harsh value,哈希值)到頁面存儲位置的一種映射,使得根據(jù)查詢時指定的查詢列的值可以直接計算出頁面中元組的位置,從而達到直接定位元組的目的。下面對此展開具體的說明。在本發(fā)明所提供的聚簇表存儲方法中,所述數(shù)據(jù)表由元組和列構(gòu)成,具體包括以下步驟步驟1 預先初始化空的數(shù)據(jù)表頁面空間;步驟2 指定所述數(shù)據(jù)表的一個或多個列為哈希列;步驟3 根據(jù)各個元組的所述哈希列的值來計算哈希值,作為相應元組的存儲位置;步驟4 根據(jù)所述哈希值映射出,所述相應元組在所述頁面空間上的行指針;步驟5 根據(jù)所述行指針,將所述相應元組插入到所述頁面空間。具體而言,首先是在建立聚簇表的過程中預先初始化空的數(shù)據(jù)表頁面空間。其次是指定數(shù)據(jù)表的一個或多個列為hash列,根據(jù)各個元組的hash列的哈希值,來確定元組存儲的位置,以便使元組按照哈希值插入到指定位置中。為了支持聚簇表的使用,本發(fā)明采用了表的預分配技術和表的溢出鏈處理技術。 表的預分配技術是指在創(chuàng)建表時,即根據(jù)哈希值動態(tài)預分配空間,這樣元組在操作時可以直接插入到指定位置,維護了元組根據(jù)索引列的哈希值進行聚簇的特性。表的溢出鏈處理技術則是針對聚簇表的特殊處理。特殊情況下,建立聚簇表時得到的各個元組的hash列的哈希值中,可能有兩個或多個哈希值相同,這就會使某個哈希值對應兩個或更多個元組。當某個哈希值對應的元組過多時,只需要對相應的哈希值增加溢出鏈,將該元組存儲到溢出鏈中,而不用影響到其它哈希值的元組的維護。在建立聚簇表之初,可以根據(jù)數(shù)據(jù)庫應用可能用到的元組的哈希列的哈希值的個數(shù)動態(tài)預分配聚簇表的存儲空間,這樣使得大多數(shù)情況下元組可以根據(jù)hash列的哈希值直接定位。對于hash列的哈希值重復的情況,如果在預先分配的頁面中沒有足夠的空間存儲元組,則可以在溢出鏈中進行元組的存儲。但在這種情況下,由于不能實現(xiàn)對元組的直接定位,可能造成數(shù)據(jù)庫系統(tǒng)的性能下降。在本發(fā)明所提供的聚簇表存儲方法中,可以使用兩種類型的哈希聚簇表非 unique (獨特)類型的哈希聚簇表和unique (獨特)類型的哈希聚簇表。兩種哈希聚簇表在存儲方式上存在一定的差異。在前者中,多個元組可以對應一個哈希值,因此同一個哈希值槽中將預留多個元組的空間,而且還可能需要溢出鏈的支持,在實際操作中略顯復雜,但通用性較強。在后者中,不同的元組必須具有不同的哈希值。由于存在不同元組的哈希值不同的限制,應用范圍比較小,但一旦應用則可以起到直接定位當前元組的作用,極大提升了數(shù)據(jù)庫系統(tǒng)的管理性能。用戶可以根據(jù)實際應用選擇合適的聚簇表類型。下面以TPCC (基準測試)應用中的C_stoCk表為例,具體說明本聚簇表存儲方法的實現(xiàn)過程。假設該c_st0Ck表有一個主鍵(s_w_id,s_i_id),兩列均為整型數(shù),且在TPCC 應用中,這兩列的值依次為(1,1),(1,2),…,(1,100000), (2,1),…,(2,100000),…, (η, 100000),共 100000η 條元組?;谝韵碌募夹g原因,選擇unique類型的哈希聚簇表來建立該C_stoCk表,且 hash 列艮口為(s_w_id, s_i_id)(1)主鍵列的值的規(guī)律性好。主鍵列的分布非常有規(guī)律,可以避免不同元組的哈希列的哈希值相同。它采用遞增的序列,因此可以使用整型hash列遞增函數(shù)作為元組分布的哈希函數(shù)。由于s_i_id列是100000進位到s_w_id的,所以這個自動生成的整型hash列遞增函數(shù)為 f (s_w_id,s_i_id) = (s_w_id_l) *100000+(s_i_id_l)。
5
(2)查詢條件的指向性好,即根據(jù)查詢條件能獲得相應的一條元組。在TPCC應用的查詢過程中,多以兩列的值為查詢條件獲得相應的一條元組進行查詢或更新操作,因此在多數(shù)情況下可以直接使用哈希掃描算法,達到優(yōu)化數(shù)據(jù)吞吐(IO)的目的。(3)查詢過程無插入操作。在TPCC應用的查詢過程中,不會在C_stoCk表上進行插入操作,因此c_Stock表的條數(shù)自測試開始前灌入數(shù)據(jù)后保持不變,在建表時即可計算出C_st0Ck表的實際大小,在后續(xù)操作中不需要繼續(xù)擴充該C_st0Ck表的使用空間。在建立c_st0ck表的過程中,首先在創(chuàng)建表時初始化100000η條元組的空間,在灌入數(shù)據(jù)時根據(jù)hash列的值計算hash函數(shù)的哈希值(hash value),然后映射出行指針以便進行元組插入,保證所有元組按照hash列值的順序插入到c_st0ck表中。此時,c_stock表中即填滿了所需要的數(shù)據(jù)。如圖1所示,在作為哈希聚簇表的C_stoCk表創(chuàng)建完成之后,如果需要進行查詢, 可以根據(jù)hash列的值計算出相應的哈希值,然后通過已經(jīng)建立的映射關系找到行指針,進而根據(jù)行指針找到相應的元組。由于c_st0Ck表為unique類型的哈希聚簇表,且使用整型 hash列遞增函數(shù)作為哈希函數(shù),因此根據(jù)行指針找到相應元組時不必進行s_w_id和s_i_ id列值的驗證。在本聚簇表存儲方法的一個實施例中,對于如下的查詢SELECT^from c_stock where s_w_id = 5 order by s_i_id ;則直接根據(jù)hash列值(5,1)計算出哈希值,進而進行元組的定位。由于內(nèi)存堆 (heap)中的元組順序即按照s_i_id的順序排序,因此直接進行內(nèi)存堆上的掃描即完成排序過程,需要掃描的元組最多為100000條。在掃描過程中,本聚簇表存儲方法除了可以使用傳統(tǒng)的順序掃描、索引掃描之外, 還可以使用聚簇掃描方式。對于查詢列包括表的所有hash列,或者特定哈希函數(shù)時查詢列為hash列的前綴以及排序操作時,優(yōu)選使用聚簇掃描方式進行,從而直接定位元組。在哈希聚簇表的查詢過程中,如果為非unique類型的哈希聚簇表,則需要對符合行指針的多條元組一一驗證其是否滿足查詢的條件。如果在溢出鏈存在的情況下,可能會多掃描幾個頁面,對數(shù)據(jù)庫系統(tǒng)的性能造成一定影響。而對于unique類型的哈希聚簇表, 同時使用了整型hash列遞增函數(shù)作為哈希函數(shù),則表明一個行指針僅對應相應列值的一條元組,不必驗證其查詢條件的滿足性,可以直接返回。對于某些基于哈希值的等值查詢,可以根據(jù)計算出的hash列的值一次性定位到相應的元組。這樣相對于使用索引的數(shù)據(jù)庫應用來說,在節(jié)省索引存儲和讀取的同時,達到了使用索引時直接定位元組的效果。如果在查詢過程后面有插入操作,則可以動態(tài)擴充哈希聚簇表的頁面空間。在執(zhí)行元組插入操作時,首先獲得元組對應的hash列的值,然后調(diào)用用戶指定的哈希函數(shù)計算出哈希值,并通過一對一的映射得到元組存儲在頁面上的行指針,然后根據(jù)行指針找到對應的頁面進行插入。如果當前頁面空間不夠用,則可引入溢出鏈機制,將元組存儲在溢出鏈中。在執(zhí)行哈希聚簇表的更新、刪除等操作時,如果在過濾條件中指明了 hash列的值,則同樣可以應用類似查詢的過程,找到元組所在的頁面執(zhí)行相應的操作。例如在進行更新操作時,執(zhí)行如下的SQL語句
UPDATE c_stock SET s_quantity = 36 WHERE s_i_id = 38426 AND s_w_id = 3 ;則根據(jù)hash列的值(3,38426)計算出哈希值為338425,從而計算出相應的行指針,即可獲得相應的元組進行更新操作。在本發(fā)明中,可以使用不同類型的hash函數(shù)。除了默認的hash函數(shù)之外,本發(fā)明還可以使用用戶自定義的hash函數(shù)或者整型hash列遞增函數(shù)。后兩種函數(shù)的使用使得元組的存儲對用戶來說基本可見。對于unique類型的哈希聚簇表而言,通常使用的是用戶自定義的hash函數(shù)。用戶可以選擇合適的hash函數(shù),通過盡可能形成unique類型的哈希聚簇表,從而提升盡可能多的數(shù)據(jù)庫性能。以上對本發(fā)明所提供的基于哈希的聚簇表存儲方法進行了詳細的說明。對本領域的技術人員而言,在不背離本發(fā)明實質(zhì)精神的前提下對它所做的任何顯而易見的改動,都將構(gòu)成對本發(fā)明專利權(quán)的侵犯,將承擔相應的法律責任。
權(quán)利要求
1.一種基于哈希的聚簇表存儲方法,所述數(shù)據(jù)表由元組和列構(gòu)成,其特征在于包括以下步驟步驟1 預先初始化空的數(shù)據(jù)表頁面空間; 步驟2 指定所述數(shù)據(jù)表的一個或多個列為哈希列;步驟3 根據(jù)各個元組的所述哈希列的值來計算哈希值,作為相應元組的存儲位置; 步驟4 根據(jù)所述哈希值映射出,所述相應元組在所述頁面空間上的行指針; 步驟5 根據(jù)所述行指針,將所述相應元組插入到所述頁面空間。
2.如權(quán)利要求1所述的聚簇表存儲方法,其特征在于根據(jù)可能用到的元組的、哈希列的哈希值的個數(shù),對所述頁面空間進行動態(tài)預分配。
3.如權(quán)利要求1所述的聚簇表存儲方法,其特征在于所述步驟3中,當各個元組的哈希列的哈希值中出現(xiàn)兩個或多個哈希值相同時,對相應的哈希值增加溢出鏈,將該元組存儲到溢出鏈中。
4.如權(quán)利要求1所述的聚簇表存儲方法,其特征在于 還包括對所述聚簇表的查詢步驟根據(jù)指定的哈希列的值計算出相應的哈希值,通過所述哈希值按照已建立的映射關系找到行指針,根據(jù)所述行指針找到相應的元組。
5.如權(quán)利要求4所述的聚簇表存儲方法,其特征在于 當所述聚簇表是非獨特類型聚簇表時,所述查詢步驟還包括 對查詢得到的、符合行指針的多條元組的哈希列的值進行驗證。
6.如權(quán)利要求4所述的聚簇表存儲方法,其特征在于當所述聚簇表是獨特類型聚簇表時,對查詢得到的符合行指針的多條元組的哈希列的值,不進行驗證。
7.如權(quán)利要求4所述的聚簇表存儲方法,其特征在于如果在查詢過程后有插入操作,則還包括動態(tài)擴充聚簇表的頁面空間的步驟 獲得需要插入的元組的哈希列的值,然后計算出哈希值,并通過一對一的映射得到所述需要插入的元組存儲在頁面上的行指針,然后根據(jù)所述行指針找到對應的頁面進行插入。
8.如權(quán)利要求7所述的聚簇表存儲方法,其特征在于如果所述行指針找到的頁面的頁面空間不夠,則將所述需要插入的元組存儲在溢出鏈中。
9.如權(quán)利要求1所述的聚簇表存儲方法,其特征在于如果查詢列包括所述數(shù)據(jù)表的所有哈希列,或者使用特定哈希函數(shù)時的查詢列為哈希列的前綴以及排序操作,則使用聚簇掃描方式進行掃描。
全文摘要
本發(fā)明公開了一種基于哈希的聚簇表存儲方法,包括以下步驟步驟1預先初始化空的數(shù)據(jù)表頁面空間;步驟2指定數(shù)據(jù)表的一個或多個列為哈希列;步驟3根據(jù)各個元組的哈希列的值來計算哈希值,作為相應元組的存儲位置;步驟4根據(jù)哈希值映射出相應元組在頁面空間上的行指針;步驟5根據(jù)行指針,將相應元組插入到頁面空間。本發(fā)明對現(xiàn)有哈希聚簇技術做了進一步改進,可以實現(xiàn)跨過索引直達元組的數(shù)據(jù)庫存儲管理機制,從而在大規(guī)模數(shù)據(jù)庫系統(tǒng)的使用過程中避免了索引對緩存資源的大量占用,改善了數(shù)據(jù)庫系統(tǒng)的使用性能。
文檔編號G06F17/30GK102521304SQ20111039227
公開日2012年6月27日 申請日期2011年11月30日 優(yōu)先權(quán)日2011年11月30日
發(fā)明者何國明, 馮玉, 冷建全, 李祥凱, 李茂增, 陳建克 申請人:北京人大金倉信息技術股份有限公司
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點贊!
1