專利名稱::一種用于列數(shù)據(jù)庫的單表多列序存儲方法
技術(shù)領(lǐng)域:
:本發(fā)明涉及一種數(shù)據(jù)庫存儲方法,尤其涉及一種用于列數(shù)據(jù)庫的單表多列序存儲方法,屬于數(shù)據(jù)庫存儲
技術(shù)領(lǐng)域:
。
背景技術(shù):
:關(guān)系型數(shù)據(jù)庫是一個用以存儲及處理結(jié)構(gòu)化數(shù)據(jù)的軟件系統(tǒng),其數(shù)據(jù)分為兩個層次一是邏輯數(shù)據(jù),它是由數(shù)據(jù)表、記錄等組成;另一是物理數(shù)據(jù),它代表數(shù)據(jù)庫怎樣存儲邏輯數(shù)據(jù)。實現(xiàn)數(shù)據(jù)庫物理數(shù)據(jù)的方法有兩種一種是基于行存儲,另一種是基于列存儲。對于基于行存儲的實現(xiàn)方法,它是把邏輯數(shù)據(jù)的整條記錄存儲到數(shù)據(jù)塊中,為了提高查詢速度,要為某些列建立B+樹等類型的索引;對于基于列存儲的實現(xiàn)方法,邏輯數(shù)據(jù)中的記錄不直接按條映射到物理數(shù)據(jù)中,而是把記錄按列分開,把所有記錄的相同列的值存在一起,同時提供連接數(shù)據(jù),用于把不同記錄的相應(yīng)的列值重新組合起來形成記錄。隨著企業(yè)及政府信息化的不斷深入,數(shù)據(jù)庫應(yīng)用的復(fù)雜性日益增強。這些需求推動著數(shù)據(jù)庫技術(shù)向海量和智能的方向發(fā)展。同時,數(shù)據(jù)倉庫和在線分析等應(yīng)用迫切需要實時高效的數(shù)據(jù)處理技術(shù)。傳統(tǒng)的基于行存儲的數(shù)據(jù)庫技術(shù)已經(jīng)出現(xiàn)了技術(shù)瓶頸。如何在快速執(zhí)行復(fù)雜查詢的同時,還能縮小存儲空間和節(jié)約成本是目前數(shù)據(jù)庫技術(shù)研究的熱點問題。列數(shù)據(jù)庫是基于列存儲技術(shù)、主要面向企業(yè)決策分析領(lǐng)域的關(guān)系型數(shù)據(jù)庫。列存儲技術(shù)的特點是數(shù)據(jù)查詢效率高,讀磁盤少,存儲空間少,是構(gòu)建數(shù)據(jù)倉庫的理想架構(gòu)。列數(shù)據(jù)庫的應(yīng)用價值來自于它對復(fù)雜查詢的快速響應(yīng)以及數(shù)據(jù)壓縮所帶來的存儲優(yōu)勢,使其在企業(yè)決策分析、數(shù)據(jù)倉庫、商業(yè)智能等應(yīng)用領(lǐng)域具有良好的發(fā)展前景。根據(jù)美國Gartner公司在2010年1月發(fā)布的關(guān)于數(shù)據(jù)倉庫的分析報告列數(shù)據(jù)庫與傳統(tǒng)關(guān)系型數(shù)據(jù)庫相比,在數(shù)據(jù)分析方面表現(xiàn)出卓越的性能。因此,列數(shù)據(jù)庫的技術(shù)研究和產(chǎn)品開發(fā)在學(xué)術(shù)界和工業(yè)界受到廣泛關(guān)注。目前,開源的列數(shù)據(jù)庫有C-More,rasdaman,MonetDB等,商用列數(shù)據(jù)庫有SykiseIQ、VerticaAnalyticDatabase、ParAccelAnalyticDatabase、EXASOLEXASolution等。近5年來,在國際一流的數(shù)據(jù)庫會議如VLDB、SIGM0D、ICDE上有關(guān)列數(shù)據(jù)庫領(lǐng)域的優(yōu)秀論文也頻頻出現(xiàn)。在申請?zhí)枮?00810187227.6的中國發(fā)明專利申請中,公開了一種實現(xiàn)基于列存儲的關(guān)系型數(shù)據(jù)庫的方法及裝置,包括建立數(shù)據(jù)文件,并對組成數(shù)據(jù)文件的數(shù)據(jù)塊按順序編序列號;定義表段;將記錄插入到表段中;對于插入到表段中的記錄生成表段內(nèi)唯一的記錄標(biāo)識號,并將記錄按列分開;對于記錄中的每一個列,執(zhí)行如下操作將列值和記錄標(biāo)識號作為值數(shù)據(jù)存儲到數(shù)據(jù)塊中并按列值大小排序;將記錄標(biāo)識號和存儲值數(shù)據(jù)的數(shù)據(jù)塊的序列號作為連接數(shù)據(jù)存儲到新的數(shù)據(jù)塊中,并按記錄標(biāo)識號大小排序;對存儲值數(shù)據(jù)的數(shù)據(jù)塊和存儲連接數(shù)據(jù)的數(shù)據(jù)塊建立索引,生成索引數(shù)據(jù)塊。該方法是對存儲值數(shù)據(jù)的數(shù)據(jù)塊和存儲連接數(shù)據(jù)的數(shù)據(jù)塊建立索引,而不是對屬于同一元組的不同列或列集合之間建立索引。
發(fā)明內(nèi)容本發(fā)明所要解決的技術(shù)問題在于提供一種用于列數(shù)據(jù)庫的單表多列序存儲方法。利用該存儲方法可以提高列數(shù)據(jù)庫的查詢效率,并減小存儲空間。為實現(xiàn)上述的發(fā)明目的,本發(fā)明采用下述的技術(shù)方案一種用于列數(shù)據(jù)庫的單表多列序存儲方法,所述列數(shù)據(jù)庫包括多個由行和列構(gòu)成的數(shù)據(jù)表,所述數(shù)據(jù)表被劃分為多個列集合,所述列集合包括一個或多個列,并且所述列集合的并集構(gòu)成所述數(shù)據(jù)表,其特征在于所述列集合兩兩之間建立連接索引,所述連接索引記錄建立了連接索引的兩個列集合中,屬于所述數(shù)據(jù)表的同一元組的列的存儲位置的一一對應(yīng)關(guān)系。其中較優(yōu)地,對每個列集合,按照屬于所述數(shù)據(jù)表的同一元組的、兩個列集合中的列的存儲位置值,建立連接索引;將所述連接索引對應(yīng)存儲到所述每個列集合中,并與所述每個列集合中的所述列對應(yīng)。其中較優(yōu)地,如果兩個列集合包含重復(fù)列,則按照所述重復(fù)列,對所述兩個列集合的行進(jìn)行排序并存儲;如果兩個列集合沒有重復(fù)列,則將所述兩個列集合的行,分別按照查詢條件來排序并存儲。其中較優(yōu)地,對于沒有重復(fù)列的所述兩個列集合,如果邏輯順序相同則不建立連接索引,如果邏輯順序不相同則建立連接索引。其中較優(yōu)地,對于有重復(fù)列的所述兩個列集合,不建立連接索引。其中較優(yōu)地,估計每個執(zhí)行計劃所需的代價,根據(jù)最優(yōu)代價選擇連接索引。其中較優(yōu)地,在判斷所述數(shù)據(jù)表的全部列都出現(xiàn)在所述多個列集合的并集中的時候,為每個列集合創(chuàng)建物化視圖,完成列集合的創(chuàng)建。其中較優(yōu)地,在建立連接索引的過程中還包括下述列集合加載步驟步驟1在所述數(shù)據(jù)表加載數(shù)據(jù);步驟2物化全部列集合物化視圖,包括物化每個列集合的存儲位置;步驟3:建立連接索引;步驟4刪除所述數(shù)據(jù)表的數(shù)據(jù);步驟5刪除不需要的存儲位置值。本發(fā)明打破了列存儲需要保持屬于同一邏輯元組的列值在每列中的位置相同的限制,使得本單表多列序存儲方法增加了使用上的靈活性。本發(fā)明可以根據(jù)報表類應(yīng)用的查詢來劃分最佳順序的投影以增強性能,也能根據(jù)連接索引處理Ad-Hoc(點對點)類的查詢而不損失性能。下面結(jié)合附圖和具體實施方式對本發(fā)明作進(jìn)一步的詳細(xì)說明。圖1顯示了一個應(yīng)用本單表多列序存儲方法的數(shù)據(jù)庫項目的示例;圖2是圖1所示的數(shù)據(jù)庫項目中,顯示存儲位置值的示意圖3是圖1所示的數(shù)據(jù)庫項目中,表明連接索引的示意圖4是本單表多列序存儲方法中,創(chuàng)建列集合的操作步驟示意圖5是在圖1所示的實施例中,所建立的連接索引的示意圖6是在圖1所示的實施例中,使用連接索引還原邏輯元組的示意圖。具體實施方式本發(fā)明使用關(guān)系數(shù)據(jù)庫的邏輯數(shù)據(jù)模型每個關(guān)系(relation)是一個二維表(table),由行(tuple,也稱元組)和列(attribute,也稱字段)構(gòu)成。在此基礎(chǔ)上,本發(fā)明使用基于列集合的物理組織來實現(xiàn)邏輯數(shù)據(jù)模型。下面首先介紹“列集合”的具體含義。列集合每個列集合都屬于一個關(guān)系,邏輯上列集合是它所屬關(guān)系的一個垂直子集;物理上包含這個關(guān)系的一個或多個列并和所屬關(guān)系有相同的行數(shù)。如果列集合所屬的關(guān)系和另一個關(guān)系是多對一的關(guān)系,列集合中也可以包含另一個關(guān)系中的列。列集合之間可以重復(fù)包含同一列,也可相互沒有重復(fù)列。換句話說,列集合之間的列可以重疊,可以包含多個數(shù)據(jù)表的相同列。屬于同一關(guān)系的所有列集合中的、列的并集就是該關(guān)系列的集合,這些列就組成了這個關(guān)系。列集合中使用列存儲,并可以按照列集合中的一列或幾列來進(jìn)行排序。這樣的組織方式可以省去索引的存儲開銷并提供針對查詢的優(yōu)化空間。在存儲過程中,可以使用多種列存儲壓縮方式,例如RLE(行程長度編碼)等。另外,可以使用分段存儲的方式提高壓縮效率。本發(fā)明提供一種用于0LAP(聯(lián)機分析處理)場景的列存儲物理組織方式,能使用較少的存儲空間并提供更多的優(yōu)化靈活性。為此,在本發(fā)明所提供的單表多列序存儲方法中,首先將要存儲的數(shù)據(jù)表作為基表,劃分為多個列的集合。同時使用存儲位置值(storagekey)的連接建立連接索引(joinindex)。該連接索引用于記錄不同列集合之間列值的一一對應(yīng)關(guān)系。列集合通過連接其他列集合的連接索引可以獲得該列集合中列值在基表中對應(yīng)的其他列值,以便重建邏輯上的一條元組。存儲位置值可以根據(jù)實際需要而設(shè)定,例如可以是基表中哈希列的哈希值等。該列集合是基表的一個垂直劃分,包含一個或多個列,和基表有相同的行數(shù)。另外,列集合也可以包含其他與基表有一對多關(guān)系的數(shù)據(jù)表的列。由于本發(fā)明打破了列存儲需要保持屬于同一邏輯元組的列值在每列中的位置需要相同的限制,使得本單表多列序存儲方法可以增加使用上的靈活性。本發(fā)明可以根據(jù)報表類應(yīng)用的查詢來劃分最佳順序的投影以增強性能,例如在圖6中,首先進(jìn)行姓名的投影,再根據(jù)連接索引找到對應(yīng)的所在系。實現(xiàn)這個過程的前提是連接索引中記錄的是列集合所在系在列集合姓名中的存儲位置。因此,在每個列集合中都要存儲連接索引,記錄本列集合中的行在另一個列集合中的位置,即本列集合中的行與另一個列集合中的哪一行對應(yīng),也能根據(jù)連接索引處理Ad-Hoc(點對點)類的查詢而不損失性能。本發(fā)明的單表多列序存儲方法,在列集合兩兩之間建立連接索引,連接索引記錄了,建立了連接索引的兩個列集合中,屬于數(shù)據(jù)表的同一元組的列的存儲位置的一一對應(yīng)關(guān)系。對每個列集合,按照屬于數(shù)據(jù)表的同一元組的、兩個列集合中的列的存儲位置值,建立連接索引,將連接索引對應(yīng)存儲到每個列集合中,并與每個列集合中的相應(yīng)列的值對應(yīng)。這樣,即使每個列集合進(jìn)行了重新排序,連接索引的值隨之而排序,也就不會影響列集合的屬于同一元組的列之間的對應(yīng)關(guān)系。下面,以一個應(yīng)用單表多列序存儲方法的數(shù)據(jù)庫項目為例,具體闡述本發(fā)明的實施步驟及其效果。該數(shù)據(jù)庫示例是用于高等院校教學(xué)管理工作的數(shù)據(jù)庫。如圖1所示,按學(xué)號排序的列集合1(學(xué)號,姓名,性別,年齡)和按所在系排序的列集合2(學(xué)號,所在系)組成了學(xué)生關(guān)系,列集合3中包含了課程中的列。如圖2所示,列集合中的每列的每個值都有一個存儲位置值,具有同一存儲位置值的列構(gòu)成一條邏輯元組。這個存儲位置值可以不采用物理存儲方式。如圖3所示,由于組成關(guān)系的列集合可以按照不同的列排序,在基表中具有同一存儲位置值的列值,可能在不同的列集合中處于不同的位置。如圖3中學(xué)號為20070026的記錄,在列集合2中位于第1行;在列集合1中位于第2行。使用連接索引標(biāo)記這種位置關(guān)系,可以在不能確定物理存儲位置時,找出與存儲位置值相同的列值,進(jìn)而通過在不同的列集合上建立連接索引,可以按照某列的順序獲得邏輯元組。例如,連接索引(即圖3中右上方的“對應(yīng)位置”)標(biāo)記了,列集合2中第1行與列集合中的第2行對應(yīng)。通過以上的說明可知,邏輯順序相同的兩個列集合間可以不需要連接索引。如果兩個列集合包含重復(fù)列,則按照該重復(fù)列,對兩個列集合的行進(jìn)行排序并存儲;如果兩個列集合沒有重復(fù)列,則將兩個列集合的行,分別按照查詢條件來排序并存儲。沒有重復(fù)列的兩個列集合,如果邏輯順序相同則不建立連接索引,如果邏輯順序不相同則建立連接索引。有重復(fù)列的兩個列集合,因為其排序相同,則不需要連接索引。圖4顯示了本單表多列序存儲方法中,創(chuàng)建列集合的操作步驟。首先,根據(jù)列集合定義判斷列表是否為空。如果列表為空則返回,如果列表不為空則取列集合,進(jìn)一步判斷基表部分的列是否在基表列集合A中,如果結(jié)果為是則將列并入列集合B中,如果結(jié)果為否則反饋錯誤信息。接下來,進(jìn)一步檢查每個沒引用其他表的列集合中的列是否屬于基表?每個引用其他表的列集合中的列是否屬于引用表,引用表和基表是否有主外鍵關(guān)系?包含列是否屬于列表X?是否有其它列集合包含了基表的列(即是否基表的全部列都出現(xiàn)在列集合中)?在以上檢查的結(jié)果均為是的情況下,將被包含的列并入列集合B中。如果出現(xiàn)檢查的結(jié)果為否的情況,則根據(jù)情況反饋錯誤信息。在列集合B與基表的列集合相同的情況下,為每個列集合創(chuàng)建一個物化視圖,取下一個列集合重復(fù)上述的操作步驟。下面顯示了創(chuàng)建使用列集合存儲方式的基表所使用的一些SQL語句示例CREATETABLEtable_name([{column_namedata_type[column_constraint[...]][,…]])WITH(ORIENTATION=COLUMN)[PROJECTIONS(projection_name({column_name[,...]other_table(column_name[,...])})ORDERBYcolumn_name[,..·])]語句說明CREATETABLEtable_name指定了表名為table_name的基表。WITH(ORIENTATION=COLUMN)指定了基表的存儲方式為列存儲。PROJECTIONS子句用于創(chuàng)建列集合,指定了包括列集合名稱,集合中包含的列,用于排序的列。在只使用基表的列的列集合情況下,使用如下的查詢語句SELECTcolumn—name…FROMtable—nameORDERBYcolumn—name;在使用到其他表的列的列集合情況下,使用如下的查詢語句SELECTcolumn_name…FROMtable_nameJOINother_tableUSING(主夕卜鍵列)ORDERBYcolumn_name。圖5顯示了在圖1所示的實施例中,所建立的連接索引的示意圖。建立連接索引所使用的SQL語句如下CREATEJOININDEXindex_nameFROMprojection_aTOprojection_b;該SQL語句創(chuàng)建了列集合projection_a到列集合projection_b的連接索引index_name。在建立連接索引的過程中,列集合的數(shù)據(jù)加載過程是這樣的1)在基表和列集合引用到的其他表加載數(shù)據(jù);2)物化全部的列集合物化視圖,包括物化每個列集合的存儲位置;3)建立連接索引;4)刪除基表和列集合引用到的其他表的數(shù)據(jù);5)刪除不需要的存儲位置。選擇連接索引的過程可以使用基于代價的優(yōu)化方式,即估計每個執(zhí)行計劃所需的代價,該代價將每個執(zhí)行計劃所耗費的資源進(jìn)行量化,根據(jù)這個代價選擇出最優(yōu)的連接索引。由于使用連接索引會造成隨機數(shù)據(jù)庫吞吐(10),因此應(yīng)該盡可能少使用連接索引。圖6顯示了在圖1所示的實施例中,使用連接索引還原邏輯元組的操作過程。該操作過程包括如下的步驟步驟10尋找包含查詢所需要的所有目標(biāo)列的列集合,如果有,則利用該列集合還原出元組;如果沒有,則進(jìn)入下一步;在圖6中具體為尋找包含查詢所有目標(biāo),即“姓名”、“所在系”,的列集合。步驟11尋找列序相同的包含查詢所需要的所有目標(biāo)列的多個列集合;步驟12在步驟11中獲得的多個列集合中,選擇使用連接索引最少的列集合組(例如圖6中的列集合1和列集合2);步驟13完成目標(biāo)列的投影之后,利用連接索引還原元組。通過盡可能推遲連接索引的使用,直至完成目標(biāo)列的投影之后,可以增強查詢性能。以上對本發(fā)明所提供的用于列數(shù)據(jù)庫的單表多列序存儲方法進(jìn)行了詳細(xì)的說明。對本領(lǐng)域的技術(shù)人員而言,在不背離本發(fā)明實質(zhì)精神的前提下對它所做的任何顯而易見的改動,都將構(gòu)成對本發(fā)明專利權(quán)的侵犯,將承擔(dān)相應(yīng)的法律責(zé)任。權(quán)利要求1.一種用于列數(shù)據(jù)庫的單表多列序存儲方法,所述列數(shù)據(jù)庫包括多個由行和列構(gòu)成的數(shù)據(jù)表,所述數(shù)據(jù)表被劃分為多個列集合,所述列集合包括一個或多個列,并且所述列集合的并集構(gòu)成所述數(shù)據(jù)表,其特征在于所述列集合兩兩之間建立連接索引,所述連接索引記錄建立了連接索引的兩個列集合中,屬于所述數(shù)據(jù)表的同一元組的列的存儲位置的一一對應(yīng)關(guān)系。2.如權(quán)利要求1所述的用于列數(shù)據(jù)庫的單表多列序存儲方法,其特征在于包括下述步驟對每個列集合,按照屬于所述數(shù)據(jù)表的同一元組的、兩個列集合中的列的存儲位置值,建立連接索引;將所述連接索引對應(yīng)存儲到所述每個列集合中,并與所述每個列集合中的所述列對應(yīng)。3.如權(quán)利要求1所述的用于列數(shù)據(jù)庫的單表多列序存儲方法,其特征在于包括下述步驟如果兩個列集合包含重復(fù)列,則按照所述重復(fù)列,對所述兩個列集合的行進(jìn)行排序并存儲;如果兩個列集合沒有重復(fù)列,則將所述兩個列集合的行,分別按照查詢條件來排序并存儲。4.如權(quán)利要求3所述的用于列數(shù)據(jù)庫的單表多列序存儲方法,其特征在于對于沒有重復(fù)列的所述兩個列集合,如果邏輯順序相同則不建立連接索引,如果邏輯順序不相同則建立連接索引。5.如權(quán)利要求3所述的用于列數(shù)據(jù)庫的單表多列序存儲方法,其特征在于對于有重復(fù)列的所述兩個列集合,不建立連接索引。6.如權(quán)利要求2所述的用于列數(shù)據(jù)庫的單表多列序存儲方法,其特征在于估計每個執(zhí)行計劃所需的代價,根據(jù)最優(yōu)代價選擇連接索引。7.如權(quán)利要求1所述的用于列數(shù)據(jù)庫的單表多列序存儲方法,其特征在于包括下述創(chuàng)建列集合的步驟在判斷所述數(shù)據(jù)表的全部列都出現(xiàn)在所述多個列集合的并集中的時候,為每個列集合創(chuàng)建物化視圖,完成列集合的創(chuàng)建。8.如權(quán)利要求1所述的用于列數(shù)據(jù)庫的單表多列序存儲方法,其特征在于在建立連接索引的過程中還包括下述列集合加載步驟步驟1在所述數(shù)據(jù)表加載數(shù)據(jù);步驟2物化全部列集合物化視圖,包括物化每個列集合的存儲位置;步驟3:建立連接索引;步驟4刪除所述數(shù)據(jù)表的數(shù)據(jù);步驟5刪除不需要的存儲位置值。9.如權(quán)利要求1所述的用于列數(shù)據(jù)庫的單表多列序存儲方法,其特征在于還包括下述利用連接索引還原邏輯元組的步驟步驟1尋找包含查詢所需要的所有目標(biāo)列的列集合,如果有,則利用該列集合還原出元組;如果沒有,則進(jìn)入下一步;步驟2尋找列序相同的包含查詢所需要的所有目標(biāo)列的多個列集合;步驟3在步驟2中獲得的多個列集合中,選擇使用連接索引最少的列集合組;步驟4:完成目標(biāo)列的投影之后,利用連接索引還原元組。10.如權(quán)利要求1所述的用于列數(shù)據(jù)庫的單表多列序存儲方法,其特征在于屬于所述數(shù)據(jù)表的同一元組的列,是指列集合中的多個列。全文摘要本發(fā)明公開了一種用于列數(shù)據(jù)庫的單表多列序存儲方法。該列數(shù)據(jù)庫包括多個由行和列構(gòu)成的數(shù)據(jù)表,數(shù)據(jù)表被劃分為多個列集合,列集合包括一個或多個列,并且列集合的并集構(gòu)成數(shù)據(jù)表,列集合兩兩之間建立連接索引,連接索引記錄了建立了連接索引的兩個列集合中,屬于數(shù)據(jù)表的同一元組的列的存儲位置的一一對應(yīng)關(guān)系。利用本發(fā)明所提供的單表多列序存儲方法,可以提高列數(shù)據(jù)庫的查詢效率,并減小存儲空間。文檔編號G06F17/30GK102521303SQ20111039203公開日2012年6月27日申請日期2011年11月30日優(yōu)先權(quán)日2011年11月30日發(fā)明者馮玉,冷建全,李祥凱,楊尚,王鴻翔申請人:北京人大金倉信息技術(shù)股份有限公司