亚洲成年人黄色一级片,日本香港三级亚洲三级,黄色成人小视频,国产青草视频,国产一区二区久久精品,91在线免费公开视频,成年轻人网站色直接看

一種實現(xiàn)基于列存儲的關系型數(shù)據(jù)庫的方法及裝置的制作方法

文檔序號:6468831閱讀:140來源:國知局
專利名稱:一種實現(xiàn)基于列存儲的關系型數(shù)據(jù)庫的方法及裝置的制作方法
技術領域
本發(fā)明關于關系型數(shù)據(jù)庫的存儲技術,具體地講是一種實現(xiàn)基于列存儲的關系型
數(shù)據(jù)庫的方法及裝置。
背景技術
關系型數(shù)據(jù)庫是一個用以存儲及處理結(jié)構化數(shù)據(jù)的軟件系統(tǒng),它含有兩種數(shù)據(jù)一種是邏輯數(shù)據(jù),它是由表、記錄等組成;另一種是物理數(shù)據(jù),它代表數(shù)據(jù)庫怎樣存儲邏輯數(shù)據(jù)。不同的關系數(shù)據(jù)庫系統(tǒng)或許有相同的邏輯數(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ù)能夠把記錄相應的列值重新組合起來形成記錄。 其中,基于行存儲的關系型數(shù)據(jù)庫和基于列存儲的數(shù)據(jù)庫相比在數(shù)據(jù)查詢性能上有劣勢,查詢時,它不能只讀取部分列,因為數(shù)據(jù)讀取是以數(shù)據(jù)塊為基本單位,所有的列都讀取到內(nèi)存中然后再去掉不需要的列,這樣就導致產(chǎn)生了很多不必要的硬盤輸入輸出,從而影響了數(shù)據(jù)庫的查詢性能。而對于基于列存儲的關系型數(shù)據(jù)庫,由于它把記錄的列分開存儲,不同的列存儲在不同的數(shù)據(jù)塊中,這樣查詢引擎就可以按需讀取列,從而減少了硬盤輸入輸出,提高了數(shù)據(jù)庫的查詢性能。 在實現(xiàn)本發(fā)明過程中,發(fā)明人發(fā)現(xiàn)現(xiàn)有技術中至少存在如下問題基于行存儲的關系型數(shù)據(jù)庫所提供的索引一般都是稠密索引,如B+樹索引,即每一條記錄的列值都必須被加入索引中,這有兩方面的缺點一是增加數(shù)據(jù)庫系統(tǒng)所用的存儲空間,二是增加數(shù)據(jù)更新時的性能。正是由于這兩方面的問題,在基于行存儲的關系型數(shù)據(jù)庫中,難以為數(shù)據(jù)表中的所有列都建立索引,這樣就出現(xiàn)了下面的問題,如果一個查詢語句是基于一個未加索引的列查詢,系統(tǒng)不得不做全表掃描,導致數(shù)據(jù)庫的性能惡化。 而現(xiàn)有技術中基于列存儲的關系型數(shù)據(jù)庫也具有缺陷,第一是它沒有對記錄進行分段存儲的概念,這樣就導致排序是在所有的插入列值之間進行,值越多,插入就越慢,第二是現(xiàn)有技術對連接數(shù)據(jù)要求記錄列值數(shù)據(jù)排序的位置,并且要求只要是列值數(shù)據(jù)的排序位置發(fā)生變化,就要更新連接數(shù)據(jù),這樣就導致數(shù)據(jù)插入時會出現(xiàn)大量的數(shù)據(jù)更新,從而影響性能。 專利號為US6606638,發(fā)明名稱為"Value-instance-co騰ctivitycomputer-implemented database"的美國專利提出了一個通過給列值排序?qū)崿F(xiàn)數(shù)據(jù)庫的方法,其公開的內(nèi)容合并于此以作為本發(fā)明的現(xiàn)有技術。

發(fā)明內(nèi)容
本發(fā)明的目的在于提供一種實現(xiàn)基于列存儲的關系型數(shù)據(jù)庫的方法及裝置,以減少硬盤的輸入輸出,并提高數(shù)據(jù)庫的查詢性能。 為了實現(xiàn)上述目的,本發(fā)明實施例的實現(xiàn)基于列存儲的關系型數(shù)據(jù)庫的方法包括 步驟1,建立數(shù)據(jù)文件,并對組成數(shù)據(jù)文件的數(shù)據(jù)塊按順序編序列號; 步驟2,定義表段; 步驟3,將記錄插入到表段中; 步驟4,對于插入到表段中的記錄生成表段內(nèi)唯一的記錄標識號,并將記錄按列分開; 步驟5,對于記錄中的每一個列,執(zhí)行如下操作 將列值和記錄標識號作為值數(shù)據(jù)存儲到數(shù)據(jù)塊中并按列值大小排序; 將記錄標識號和存儲值數(shù)據(jù)的數(shù)據(jù)塊的序列號作為連接數(shù)據(jù)存儲到新的數(shù)據(jù)塊
中,并按記錄標識號大小排序; 步驟6、對存儲值數(shù)據(jù)的數(shù)據(jù)塊和存儲連接數(shù)據(jù)的數(shù)據(jù)塊建立索引,生成索引數(shù)據(jù)塊。 本發(fā)明實施例的實現(xiàn)基于列存儲的關系型數(shù)據(jù)庫的裝置包括 數(shù)據(jù)文件建立單元,用于建立數(shù)據(jù)文件,并對組成數(shù)據(jù)文件的數(shù)據(jù)塊按順序編序
列號; 表段定義單元,用于定義表段; 記錄插入單元,用于將記錄插入到表段中; 標識號生成單元,對于插入到表段中的記錄生成表段內(nèi)唯一的記錄標識號,并將記錄按列分開; 列存儲單元,用于存儲記錄中的每一個列,該列存儲單元包括值數(shù)據(jù)存儲單元和連接數(shù)據(jù)存儲單元,所述值數(shù)據(jù)存儲單元用于將列值和記錄標識號作為值數(shù)據(jù)存儲到數(shù)據(jù)塊中并按列值大小排序;所述連接數(shù)據(jù)存儲單元用于將記錄標識號和存儲值數(shù)據(jù)的數(shù)據(jù)塊的序列號作為連接數(shù)據(jù)存儲到新的數(shù)據(jù)塊中,并按記錄標識號大小排序;以及 索引建立單元,用于對存儲值數(shù)據(jù)的數(shù)據(jù)塊和存儲連接數(shù)據(jù)的數(shù)據(jù)塊建立索引,生成索引數(shù)據(jù)塊。 本發(fā)明實施例中記錄的列可以按需讀取,不相關的列無需被讀取,這樣和基于行存儲的關系型數(shù)據(jù)庫系統(tǒng)相比,就減少了硬盤輸入輸出,提高了數(shù)據(jù)庫的查詢性能。


此處所說明的附圖用來提供對本發(fā)明的進一步理解,構成本申請的一部分,并不
構成對本發(fā)明的限定。在附圖中 圖l為本發(fā)明的主流程圖。
圖2為數(shù)據(jù)文件的示意圖。 圖3為表的邏輯結(jié)構和它的內(nèi)容的示意圖。 圖4為表段的示意圖。 圖5為把記錄按列分開的示意圖。 圖6為插入值數(shù)據(jù)元素到值數(shù)據(jù)塊的示意圖。
6
圖7為插入具有相同列值的值數(shù)據(jù)元素到值數(shù)據(jù)塊的示意圖。
圖8為插入連接數(shù)據(jù)元素的示意圖。 圖9為插入值數(shù)據(jù)元素導致值數(shù)據(jù)元素移動的示意圖。 圖10為值數(shù)據(jù)塊的通用查詢索引樹的示意圖。
圖11為連接數(shù)據(jù)塊的通用查詢索引樹的示意圖。 圖12為插入連接數(shù)據(jù)元素導致索引更新的示意圖。 圖13為刪除連接數(shù)據(jù)元素導致索引更新的示意圖。 圖14為插入連接數(shù)據(jù)元素導致數(shù)據(jù)塊分裂及索引更新的示意圖。 圖15為插入值數(shù)據(jù)元素導致數(shù)據(jù)塊分裂及索引更新的示意圖。 圖16為插入值數(shù)據(jù)元素導致值數(shù)據(jù)元素移動和索引更新的示意圖。 圖17插入記錄到空的表段中的示意圖。 圖18插入記錄到非空的表段中的示意圖。 圖19為更新記錄的示意圖。 圖20為刪除記錄并回收記錄標識號的示意圖。 圖21為數(shù)據(jù)庫表投影操作的示意圖。 圖22為數(shù)據(jù)庫表條件查詢操作的示意圖。 圖23為數(shù)據(jù)庫表聯(lián)合查詢操作的示意圖。 圖24為本發(fā)明實施例的實現(xiàn)基于列存儲的關系型數(shù)據(jù)庫系統(tǒng)的裝置的結(jié)構示意圖。
具體實施例方式
為使本發(fā)明的目的、技術方案和優(yōu)點更加清楚明白,下面結(jié)合實施方式和附圖,對本發(fā)明做進一步詳細說明。在此,本發(fā)明的示意性實施方式及其說明用于解釋本發(fā)明,但并不作為對本發(fā)明的限定。 本發(fā)明提供了一個實現(xiàn)基于列存儲的關系型數(shù)據(jù)庫系統(tǒng)的非常有效的方法,該方法中 首先建立數(shù)據(jù)文件,數(shù)據(jù)文件由一序列固定大小的數(shù)據(jù)塊組成,對數(shù)據(jù)塊編序列號,序列號從零開始,依次增加。 然后定義表段,可根據(jù)計算機的內(nèi)存大小定義好表段,內(nèi)存越大,表段中所能存儲的記錄數(shù)就越大,具體的比率關系可以預先設置。記錄被以下操作存儲到一個表段中
1)首先產(chǎn)生一個表段中唯一的正整數(shù)為記錄標識號。
2)把記錄分成列,對于每一個列,做以下操作 2. 1)存儲列值和記錄標識號到數(shù)據(jù)塊中并按列值大小排序,這種數(shù)據(jù)被引用為"值數(shù)據(jù)"。如果數(shù)據(jù)塊中已含有相同的列值,合并具有相同列值的記錄標識號成記錄標識號組,其中記錄標識號組中的記錄標識號按大小排序,存儲這類數(shù)據(jù)的數(shù)據(jù)塊被引用為"值數(shù)據(jù)塊",而值數(shù)據(jù)塊中的數(shù)據(jù)元素被引用為"值數(shù)據(jù)元素"。 2. 2)把記錄標識號和存儲值數(shù)據(jù)的數(shù)據(jù)塊序列號按記錄標識號排序存儲到新的數(shù)據(jù)塊中,這種數(shù)據(jù)被引用為"連接數(shù)據(jù)",而存儲連接數(shù)據(jù)的數(shù)據(jù)塊被引用為"連接數(shù)據(jù)塊"。連接數(shù)據(jù)可以用來把相應的值數(shù)據(jù)連接起來而形成一條記錄。
為值數(shù)據(jù)塊和連接數(shù)據(jù)塊都建立通用查詢索引樹,索引樹是由數(shù)據(jù)塊組成,被引
用為"索引數(shù)據(jù)塊",索引數(shù)據(jù)塊是由索引數(shù)據(jù)元素組成,而索引數(shù)據(jù)元素又由索引鍵和被
索引的數(shù)據(jù)塊序列號組成。在索引數(shù)據(jù)塊中,索引數(shù)據(jù)元素按照索引鍵大小排序。索引數(shù)
據(jù)元素的索引鍵是被索引數(shù)據(jù)塊的第一個元素的值如果被索引的數(shù)據(jù)塊是值數(shù)據(jù)塊,那
么索引鍵是值數(shù)據(jù)塊中第一個值數(shù)據(jù)元素的列值;如果被索引的數(shù)據(jù)塊是連接數(shù)據(jù)塊,那
么索引鍵就是連接數(shù)據(jù)塊中第一個連接數(shù)據(jù)元素的記錄標識號;如果被索引的數(shù)據(jù)塊是索
引數(shù)據(jù)塊,那么索引鍵就是被索引的索引數(shù)據(jù)塊的第一個索引數(shù)據(jù)元素的鍵值。由于索引
只建立到數(shù)據(jù)塊級,這樣的索引樹只占很小的存儲空間,被引用為"稀松索引"。 如果插入或更新記錄的列值數(shù)據(jù)導致數(shù)據(jù)塊溢出,部分值數(shù)據(jù)元素不得不被移到
新的值數(shù)據(jù)塊中,那么,其相應的連接數(shù)據(jù)元素的值數(shù)據(jù)塊序列號必須被更新為新的值數(shù)
據(jù)塊的序列號來反映這些變化。 由于所有的列值數(shù)據(jù)都有通用查詢索引,基于任何列的查詢都不會導致全表掃描,并且,由于記錄的列被分開存儲,查詢時,記錄的列可以按需讀取,不相關的列無需被讀取,這樣和基于行存儲的關系型數(shù)據(jù)庫系統(tǒng)相比,就減少了硬盤輸入輸出,提高了數(shù)據(jù)庫的查詢性能。 下面對本發(fā)明實施例進行更具體地說明。
圖1為本發(fā)明的主流程圖,如圖所示,該方法包括 步驟110,建立數(shù)據(jù)文件。本實施例中,數(shù)據(jù)文件是由一序列固定大小的數(shù)據(jù)塊組成,對數(shù)據(jù)塊從零開始進行編號依次增加,這個編號引用為"數(shù)據(jù)塊序列號"。為了得到數(shù)據(jù)塊在數(shù)據(jù)文件中的位置,以字節(jié)為單位,可用以下程式計算位置=數(shù)據(jù)塊序列號X數(shù)據(jù)塊字節(jié)數(shù)。 圖2是數(shù)據(jù)文件的示意圖,數(shù)據(jù)文件由n個固定大小的數(shù)據(jù)塊組成,每一個數(shù)據(jù)塊有一個序列號,從零開始。當數(shù)據(jù)文件由于數(shù)據(jù)的存儲導致所有的數(shù)據(jù)塊被占用滿時,系統(tǒng)自動擴充新的數(shù)據(jù)塊給數(shù)據(jù)文件,用來容納新的數(shù)據(jù)。 步驟120,根據(jù)計算機的內(nèi)存容量大小定義好表段,該表段用來存儲表的記錄。表段中可容納的最大記錄數(shù)和計算機內(nèi)存大小成正比,比率可以設置。比如可以設為1G內(nèi)存對應一百萬條記錄,如果計算機內(nèi)存是2G,那么表段可容納的最大記錄數(shù)是二百萬。這樣,四百萬條記錄就被分成兩個表段,每個表段含有二百萬條記錄。 圖3是一個數(shù)據(jù)庫表的邏輯結(jié)構的示意圖,它是由三個列組成ID, NAME和PRICE,它共有四條記錄(POOl, Radio, 10. 99) , (P002, Pen, 1. 99) , (P003, TV,200. 99)和(P004,Camera,100. 99)。 圖4是一個表段的示意圖。該表段最大可容納的記錄數(shù)是二,插入四條記錄后,生成了兩個表段,每一個表段含有兩條記錄。表段1含有記錄(P001,Radio,10. 99)和(P002,Pen, 1. 99)。表段2含有記錄(P003, TV,200. 99)和(P004, Camera, 100. 99)。表段中的記錄可以用列值數(shù)據(jù)中的記錄標識號進行連接組建,比如,在表段1中,列"ID"的值數(shù)據(jù)元素(P001, 1)可以和列"NAME"的值數(shù)據(jù)元素(Radio, 1)相連,再和列"PRICE"的值數(shù)據(jù)元素(10. 99, 1)相連,這樣就組成了記錄(P001, Radio, 10. 99)。記錄標識號1,2只在各自的表段中唯一。 步驟130,將表的記錄插入到當前定義的表段中。當由于持續(xù)插入記錄導致當前表
8段達到它的最大記錄數(shù)時,重復步驟2建立新的表段用以插入新的記錄。 步驟140,對于插入到表段中的記錄,系統(tǒng)產(chǎn)生一個在表段中唯一的正整數(shù)作為記
錄的標識號,同時,把記錄按列分開。 圖5是把表段中的記錄按列分開的示意圖。記錄為(P001,Radio, 10. 99),它的列分別為ID, NAME, PRICE,把記錄按這三個列分開,分別為:(P001) , (Radio) , (10. 99)。
步驟150,對于記錄的每一個列,作以下存儲操作存儲值數(shù)據(jù)和連接數(shù)據(jù)。[OO72] (1)存儲值數(shù)據(jù) 存儲列值和記錄標識號到數(shù)據(jù)塊中并按列值大小排序,這種數(shù)據(jù)稱為值數(shù)據(jù)。如果數(shù)據(jù)塊中已含有相同的值,合并相應的記錄標識號成記錄標識號組,其中記錄標識號組中的記錄標識號按大小排序,存儲這類數(shù)據(jù)的數(shù)據(jù)塊稱為值數(shù)據(jù)塊,而值數(shù)據(jù)塊中的數(shù)據(jù)元素叫值數(shù)據(jù)元素。 值數(shù)據(jù)塊是由值數(shù)據(jù)元素組成,而值數(shù)據(jù)元素有兩種一種是簡單值數(shù)據(jù)元素,它是由一個列值和一個記錄標識號構成,用以表示列值只被一條記錄引用;另一種是復合數(shù)據(jù)元素,它是由一個列值和一個記錄標識號組構成,并且記錄標識號組中的記錄標識號按照記錄標識號的大小排序,它是用以表示多條記錄含有相同的列值。值數(shù)據(jù)塊中的值數(shù)據(jù)元素按照值數(shù)據(jù)元素的列值進行排序存儲。為了提高查詢速度,值數(shù)據(jù)塊可以建立映射記錄標識號到列值的哈希表,當需要查詢一個記錄標識號所對應的列值時,利用哈希表就可以快速查詢到結(jié)果。 圖6是一個插入值數(shù)據(jù)元素到值數(shù)據(jù)塊中的示意圖,在插入值數(shù)據(jù)元素(TV,3)之前,值數(shù)據(jù)塊是由兩個簡單值數(shù)據(jù)元素組成(Camera, 1)和(Pen, 2),它們按照值排序Camera, Pen。插入值數(shù)據(jù)元素(TV,3)后,值數(shù)據(jù)塊變成由三個簡單數(shù)據(jù)元素組成(Camera, 1) , (Pen, 2)和(TV, 3),它們是按照值進行排序:C謙ra, Pen, TV。
圖7是一個插入具有相同列值的值數(shù)據(jù)元素到值數(shù)據(jù)塊中的示意圖,在插入值數(shù)據(jù)元素(Camera, 3)之前,值數(shù)據(jù)塊是由兩個簡單值數(shù)據(jù)元素組成(Camera, 1)和(Pen,2),由于值數(shù)據(jù)塊已含有列值為Camera的值數(shù)據(jù)元素,插入值數(shù)據(jù)元素(Camera, 3)就導致值數(shù)據(jù)塊產(chǎn)生復合值數(shù)據(jù)元素,因此,插入后,值數(shù)據(jù)塊變成了含有一個復合數(shù)據(jù)元素(Camera, 13)和一個簡單值數(shù)據(jù)元素(Pen, 2)。其中復合數(shù)據(jù)元素(Camera, 13)中的記錄標識號組是按照記錄標識號大小排序1,3。[OO77] (2)存儲連接數(shù)據(jù) 存儲記錄標識號和數(shù)據(jù)塊序列號到新的數(shù)據(jù)塊中并按記錄標識號大小進行排序,其中數(shù)據(jù)塊序列號是指l)中存儲記錄標識號所相應的值數(shù)據(jù)元素的數(shù)據(jù)塊的序列號。存儲這類數(shù)據(jù)的數(shù)據(jù)塊稱為連接數(shù)據(jù)塊,插入在連接數(shù)據(jù)塊中形成的數(shù)據(jù)元素被稱為連接數(shù)據(jù)元素。 連接數(shù)據(jù)塊是由連接數(shù)據(jù)元素組成,連接數(shù)據(jù)元素是由一個記錄標識號和一個數(shù)據(jù)塊序列號組成,其中值數(shù)據(jù)塊序列號是存儲記錄標識號所相應的值數(shù)據(jù)元素的值數(shù)據(jù)塊的序列號。連接數(shù)據(jù)塊中的連接數(shù)據(jù)元素按照記錄標識號的大小進行排序存儲,可用二分法查找一個給定記錄標識號的值數(shù)據(jù)塊序列號。由于連接數(shù)據(jù)元素含有存儲值數(shù)據(jù)的數(shù)據(jù)塊序列號,它可以用來定位值數(shù)據(jù)元素。 圖8是一個插入連接數(shù)據(jù)元素到連接數(shù)據(jù)塊的示意圖。它是列NAME的連接數(shù)據(jù)塊,在插入連接數(shù)據(jù)元素(3, 1002)之前,共含有兩個連接數(shù)據(jù)元素(l,匪)和(2, 1001),其中連接數(shù)據(jù)元素是按照記錄標識號進行排序1,2,插入新的連接數(shù)據(jù)元素(3,1002)后,共含有三個連接數(shù)據(jù)元素(1, 1001), (2, 1001)和(3,1002),其中連接數(shù)據(jù)元素是按照記錄標識號進行排序1,2,3。連接數(shù)據(jù)元素(1, 1001)表示標識號為1的記錄的列值被存儲在數(shù)據(jù)塊1001中,連接數(shù)據(jù)元素(2,1001)表示標識號為2的記錄的列值被存儲在數(shù)據(jù)塊1001中,連接數(shù)據(jù)元素(3,1002)表示標識號為3的記錄的列值被存儲在數(shù)據(jù)塊1002中。
步驟160,如果插入或更新列值導致其它已存儲的記錄標識號被移到新的數(shù)據(jù)塊中,需要更新這些被移動的記錄標識號所對應的連接數(shù)據(jù)元素的數(shù)據(jù)塊序列號為新的數(shù)據(jù)塊的序列號。 圖9是一個插入值數(shù)據(jù)導致值數(shù)據(jù)元素被移到新的數(shù)據(jù)塊中的示意圖。在插入值數(shù)據(jù)元素(Radio, 3)之前,值數(shù)據(jù)塊含有兩個簡單值數(shù)據(jù)元素(Camera, 1)和(TV,2),和它們相應的連接數(shù)據(jù)元素分別為(1,2002)和(2,2002),表示記錄1和記錄2的列值都存儲在值數(shù)據(jù)塊2002中。插入(Radio, 3)后,假設值數(shù)據(jù)塊溢出,值數(shù)據(jù)元素(TV,2)不得不移出來使得值數(shù)據(jù)塊2002不再溢出,同時建立了一個新的值數(shù)據(jù)塊2003來存儲移出的值數(shù)據(jù)元素(TV,2)。由于值數(shù)據(jù)元素的移動,它所相應的連接數(shù)據(jù)元素的值數(shù)據(jù)塊序列號要被更新成新的值數(shù)據(jù)塊序列號連接數(shù)據(jù)元素(2,2002)被更新成(2,2003)來表示它所對應的值數(shù)據(jù)元素被移到了值數(shù)據(jù)塊2003中。同時值數(shù)據(jù)塊2003就成了值數(shù)據(jù)塊2002的兄弟數(shù)據(jù)塊。 步驟170,對存儲的數(shù)據(jù)塊建立索引。為了提高對值數(shù)據(jù)元素和連接數(shù)據(jù)元素的查詢速度,值數(shù)據(jù)塊和連接數(shù)據(jù)塊都建立有通用查詢索引樹,它一般是由根、中間及葉索引數(shù)據(jù)塊組成,而每一個索引數(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ù)塊,而其相應的索引數(shù)據(jù)塊稱為父數(shù)據(jù)塊,沒有父數(shù)據(jù)塊的索引數(shù)據(jù)塊被稱為根索引數(shù)據(jù)塊,所索引的數(shù)據(jù)塊是值數(shù)據(jù)塊或者連接數(shù)據(jù)塊的索引數(shù)據(jù)塊被稱為葉數(shù)據(jù)塊,其他類型的索引數(shù)據(jù)塊被稱為中間索引數(shù)據(jù)塊。索引數(shù)據(jù)元素的鍵是它所索引的數(shù)據(jù)塊的第一個元素的值如果被索引的數(shù)據(jù)塊是索引數(shù)據(jù)塊,索引鍵就是數(shù)據(jù)塊存儲的第一個索引數(shù)據(jù)元素中的索引鍵;如果被索引的數(shù)據(jù)塊是值數(shù)據(jù)塊,索引鍵就是數(shù)據(jù)塊中存儲的第一個值數(shù)據(jù)元素中的列值;如果被索引的數(shù)據(jù)塊是連接數(shù)據(jù)塊,索引鍵就是數(shù)據(jù)塊中存儲的第一個連接數(shù)據(jù)元素中的記錄標識號。索引數(shù)據(jù)塊中存儲的索引數(shù)據(jù)元素是按照鍵的大小排序。 圖IO是一個值數(shù)據(jù)塊的通用查詢索引樹的示意圖。葉索引數(shù)據(jù)塊中含有兩個索引數(shù)據(jù)元素第一個索引數(shù)據(jù)元素含有鍵"Camera",而第二個索引數(shù)據(jù)元素含有鍵"Radio",它們都是各自索引的值數(shù)據(jù)塊的第一個值數(shù)據(jù)元素的列值。 圖11是一個連接數(shù)據(jù)塊的通用查詢索引樹的示意圖。葉索引數(shù)據(jù)塊含有兩個索引數(shù)據(jù)元素,第一個索引數(shù)據(jù)元素含有鍵"1",第二個索引數(shù)據(jù)元素含有鍵"7",它們都是各自索引的連接數(shù)據(jù)塊的第一個連接數(shù)據(jù)元素的記錄標識號。 如果更新數(shù)據(jù)導致索引數(shù)據(jù)元素所索引的數(shù)據(jù)塊的第一個元素發(fā)生變化,索引數(shù)據(jù)元素的鍵必須更新為新的鍵值來反映這個變化。如果,插入新的數(shù)據(jù)導致數(shù)據(jù)塊溢出,即數(shù)據(jù)元素占用的存儲空間超過了數(shù)據(jù)塊的容量,最后的數(shù)據(jù)元素需要被移出以使得數(shù)據(jù)
塊不再溢出。被移出的數(shù)據(jù)元素可以移到兄弟數(shù)據(jù)塊中如果兄弟數(shù)據(jù)塊有足夠的空間容納
它,否則,需要建立新的數(shù)據(jù)塊來存儲,新的數(shù)據(jù)塊需要被加入到索引樹中。 圖12是插入連接數(shù)據(jù)元素導致索引更新的示意圖。插入新的連接數(shù)據(jù)元素(6,
2000)導致(6,2000)成為數(shù)據(jù)塊的新的第一個元素,其相應的索引需要更新來反映這個變
化,從而索引數(shù)據(jù)元素的鍵7更新成為6。 圖13是刪除連接數(shù)據(jù)元素導致索引更新的示意圖。連接數(shù)據(jù)元素(1, 1001)被從 連接數(shù)據(jù)塊中刪除,(3,1002)成為新的第一個數(shù)據(jù)元素,它所相應的索引數(shù)據(jù)元素的鍵需 要被從1更新成3來反映這個變化。 圖14是一個插入新的連接元素導致連接數(shù)據(jù)塊溢出的示意圖。插入(2,1001)導
致連接數(shù)據(jù)塊溢出,連接數(shù)據(jù)元素(3,1002)被移出,由于它的兄弟數(shù)據(jù)塊沒有足夠的空閑
空間來接納(3,1002),系統(tǒng)就生成一個新的連接數(shù)據(jù)塊,連接數(shù)據(jù)元素(3,1002)被移到新
的連接數(shù)據(jù)塊中,索引數(shù)據(jù)塊中需要加入一個新的索引數(shù)據(jù)元素來索引新的連接數(shù)據(jù)塊。 圖15是一個插入新的值數(shù)據(jù)元素導致值數(shù)據(jù)塊溢出的示意圖。插入(Apple,6)
導致值數(shù)據(jù)塊溢出,簡單數(shù)據(jù)元素(Cookie, 3)被移出,但由于它的兄弟數(shù)據(jù)塊沒有足夠的
空閑空間,這樣,系統(tǒng)就生成一個新的值數(shù)據(jù)塊,(Cookie, 3)被移到新的值數(shù)據(jù)塊中,索引
數(shù)據(jù)塊中需要加入一個新的索引數(shù)據(jù)元素來索引新的連接數(shù)據(jù)塊,同時由于(Apple,6)成
為新的第一個數(shù)據(jù)元素,其所相應的索引數(shù)據(jù)元素需要更新索引鍵為Apple。 圖16是插入新的值數(shù)據(jù)元素導致值數(shù)據(jù)塊溢出的示意圖。新的值數(shù)據(jù)元素
(Apple,6)被插入到值數(shù)據(jù)塊中,導致值數(shù)據(jù)塊溢出,值數(shù)據(jù)塊的最后一個值數(shù)據(jù)元素
(Cookie, 3)需要被移出,它被移入兄弟值數(shù)據(jù)塊中,這是因為兄弟值數(shù)據(jù)塊有足夠的空
間來接納它,這就導致兄弟值數(shù)據(jù)塊的第一個元素發(fā)生變化。由于插入(Apple,6)導致
第一個值數(shù)據(jù)塊的第一個元素發(fā)生了變化,它所相應的索引數(shù)據(jù)元素的鍵需要被更新成
"Apple",而兄弟值數(shù)據(jù)塊的第一個元素也發(fā)生了變化,它所相應的數(shù)據(jù)索引數(shù)據(jù)元素需要
被更新成"Cookie",而由于索引數(shù)據(jù)塊的第一個索引數(shù)據(jù)元素的鍵發(fā)生了變化,它所相應
的索引數(shù)據(jù)元素的鍵也需要更新成"Apple"來反映這些變化。 利用圖1所示的流程所建立的關系型數(shù)據(jù)庫的基本的數(shù)據(jù)庫操作包括 (1)插入 當插入一個新的記錄時,首先檢查當前的表段中的記錄數(shù)是否達到最大,如果是 達到最大,需要建立新的表段來接受新的記錄。當插入記錄r(c0,cl,…,cn)(c0,cl,, cn表示記錄的n個列值)到一個表段中,系統(tǒng)生成一個正整數(shù)id作為記錄的標識號,id在 表段中唯一,然后把記錄按照列分開,對于每一個列ci,插入值數(shù)據(jù)元素(ci, id),如果數(shù) 據(jù)塊中已含有列值ci,合并記錄標識號成一個組來生成一個復合值數(shù)據(jù)元素(ci,id idl… idk),其中id0,idl,…,idk按大小排序。記錄下記錄標識號被插入的數(shù)據(jù)塊的序列號,假 設是vid,接下來,插入鏈接數(shù)據(jù)元素(id,vid)到連接數(shù)據(jù)塊中。 如果插入記錄導致值數(shù)據(jù)塊或者連接數(shù)據(jù)塊的第一個元素發(fā)生變化,它們所相應 的索引需要更新來反映這些變化。 如果插入記錄導致值數(shù)據(jù)塊或連接數(shù)據(jù)塊溢出,那么溢出數(shù)據(jù)塊的最后的數(shù)據(jù)元 素需要移出來減少數(shù)據(jù)塊元素的所用空間,使得數(shù)據(jù)塊不再溢出,移出的數(shù)據(jù)元素可以被
11移到兄弟數(shù)據(jù)塊中如果兄弟數(shù)據(jù)塊有足夠的空閑空間,否則,需要建立新的數(shù)據(jù)塊來接受 移出的數(shù)據(jù)元素。索引樹需要更新來反映這些變化,具體操作參見前面關于通用查詢索引 樹的有關描述。 圖17是一個關于插入記錄到一個空的表段的示意圖。記錄是(P001,TV,100.99), 表段生成的記錄標識號是1,然后把記錄按照列分成(P001), (TV), (100.99),再分別插入 這三個列的值數(shù)據(jù)元素和列數(shù)據(jù)元素。系統(tǒng)生成新的值數(shù)據(jù)塊和新的連接數(shù)據(jù)塊來接受這 些值。其中值數(shù)據(jù)塊1001含有值數(shù)據(jù)元素(P001, 1),值數(shù)據(jù)塊1002含有值數(shù)據(jù)元素(TV, 1),值數(shù)據(jù)塊1003含有值數(shù)據(jù)元素(100.99,1)。第一個連接數(shù)據(jù)塊含有(1,1001),第二個 連接數(shù)據(jù)塊含有(1,1002),第三個連接數(shù)據(jù)塊含有(1,1003)。連接(P001,1), (TV,l)和 (100. 99, 1)可得到記錄(P001, TV, 100. 99)。 圖18是插入記錄到一個非空的表段的示意圖。表段中已含有記錄(P001, TV, 100. 99),插入記錄(P002, Camera, 50. 99),表段生成了新的記錄標識號2,記錄被按列分 開插入到表段中,包括值數(shù)據(jù)元素和連接數(shù)據(jù)元素。插入后,值數(shù)據(jù)塊1001含有(POOl, 1) , (P002, 2),值數(shù)據(jù)塊1002含有:(Camera, 2) , (TV, 1),值數(shù)據(jù)塊1003含有:(50. 99, 2), (100.99,1);連接數(shù)據(jù)塊1含有(1, 1001), (2,1001),連接數(shù)據(jù)塊2含有(1,1002), (2, 1002),連接數(shù)據(jù)塊含有(1, 1003) , (2, 1003)。值數(shù)據(jù)塊中的值數(shù)據(jù)元素是按照列值排序存 儲,而連接數(shù)據(jù)塊中的連接數(shù)據(jù)元素是按照記錄標識號排序存儲。連接(POOl,l), (TV,l), (100.99,1)得到記錄(POOl, TV, 100. 99),連接(P002,2), (Camera, 2), (50.99,2)得到記 錄(P002, Camera,50. 99)。 [OO"] (2)更新 更新記錄的列值是通過刪除舊的值數(shù)據(jù)元素和插入新的值數(shù)據(jù)元素來完成,如果 值數(shù)據(jù)元素被插入到的值數(shù)據(jù)塊和舊的值數(shù)據(jù)元素所在的值數(shù)據(jù)塊不同,那么它所相應的 連接數(shù)據(jù)元素中的數(shù)據(jù)塊序列號就要更新成新的數(shù)據(jù)塊序列號。 如果更新記錄導致值數(shù)據(jù)塊或連接數(shù)據(jù)塊的第一個數(shù)據(jù)元素發(fā)生變化,相應的索 引樹需要更新來反映這些變化。 如果更新記錄導致值數(shù)據(jù)塊或連接數(shù)據(jù)塊溢出,那么數(shù)據(jù)塊的最后的數(shù)據(jù)元素需 要移出來使得數(shù)據(jù)塊不再溢出,而移出的數(shù)據(jù)元素可以移到兄弟數(shù)據(jù)塊中如果兄弟數(shù)據(jù)塊 有足夠的空閑空間,否則,需要生成新的數(shù)據(jù)塊來接受溢出的數(shù)據(jù)元素。索引樹需要更新來 反映這些變化。 圖19是記錄更新的示意圖。更新記錄(P001,TV, 100.99)的列PRICE為40. 99,首 先,值數(shù)據(jù)元素(100. 99, 1)被從值數(shù)據(jù)塊1003中刪除,然后插入新的值數(shù)據(jù)元素(40. 99, 1),這樣值數(shù)據(jù)塊畫就含有數(shù)據(jù)元素:(40. 99, 1) , (50. 99, 2),由于值數(shù)據(jù)塊1003的第一 個數(shù)據(jù)元素發(fā)生了變化,其相應的索引樹需要更新。又由于新的值數(shù)據(jù)元素還在同一個值 數(shù)據(jù)塊中,無需更新連接數(shù)據(jù)塊。
(3)刪除 刪除記錄是通過刪除所有列的值數(shù)據(jù)元素和連接數(shù)據(jù)元素來處理。首先,對于每 一個列,刪除它的連接數(shù)據(jù)元素,然后,通過連接數(shù)據(jù)元素的數(shù)據(jù)庫序列號,找到值數(shù)據(jù)塊, 然后刪除記錄比標識號所對應的值數(shù)據(jù)元素。如果刪除使得值數(shù)據(jù)塊或連接數(shù)據(jù)塊變空, 系統(tǒng)需要回收它們。當記錄被刪除后,記錄標識號需要被回收。
圖20是刪除記錄的示意圖。刪除記錄的ID為P002的記錄,首先系統(tǒng)通過ID的 值數(shù)據(jù)塊和它的索引定位到含有P002的值數(shù)據(jù)塊,找到P002所相應的記錄標識號是2,從 ID的連接數(shù)據(jù)塊中刪除2所對應的連接數(shù)據(jù)元素,通過連接數(shù)據(jù)元素得到值數(shù)據(jù)塊序列號 IOOI,定位值數(shù)據(jù)塊,刪除值數(shù)據(jù)元素,采用同樣的步驟刪除列NAME, PRICE所對應的連接 數(shù)據(jù)元素和值數(shù)據(jù)元素,這樣就刪除了記錄(P002, Camera, 50. 99)。 [O107] (4)投影查詢 投影查詢是指查詢表中記錄的某些列,由于列是分開存儲,這樣列就可以按需讀 取,而不是象基于行存儲的數(shù)據(jù)庫那樣需要讀取所有列的數(shù)據(jù),這樣就大大減少了硬盤輸 入輸出,從而提高了數(shù)據(jù)庫的查詢性能。 圖21是投影查詢的示意圖。投影查詢語句是"select NAME, PRICE fromPRODUCT",查詢引擎按以下方式操作對于列NAME和PRICE,分別讀取它們的值數(shù)據(jù) 塊,然后根據(jù)記錄標識號連接相應的列值,輸出結(jié)果。列ID的值數(shù)據(jù)塊沒有被讀取。
(5)條件查詢 條件查詢是指查詢語句有查詢條件,系統(tǒng)可以值讀取和查詢條件相關的列的數(shù) 據(jù),一旦記錄的列值通過了這些查詢條件,所有其他需要輸出的列值就被讀取,輸出到最終 的結(jié)果當中。 圖22是條件查詢的示意圖。條件查詢的語句是"select NAME, PRICEfrom PRODUCT where PRICE = 100. 99",查詢引擎首先利用列PRICE的值數(shù)據(jù)塊的索引來快速 定位含有100. 99的值數(shù)據(jù)塊,找到了記錄標識號1,然后用記錄標識號1去從列NAME的 連接數(shù)據(jù)塊中尋找相應的連接數(shù)據(jù)元素,可用連接數(shù)據(jù)塊的通用查詢索引樹來縮小搜索范 圍,找到連接數(shù)據(jù)塊后,用二分法找到記錄標識號1所對應的值數(shù)據(jù)塊1002,然后,讀取值 數(shù)據(jù)塊1002,利用值數(shù)據(jù)塊的哈希表找到1所對應的列值為TV,這樣就得到了記錄(TV, 跳99)。 (6)聯(lián)合查詢 聯(lián)合查詢是指需要聯(lián)合兩個表來得到查詢結(jié)果。系統(tǒng)可以只讀入需要聯(lián)合的鍵值 所對應的列,然后做聯(lián)合查詢,對于鍵值可以聯(lián)合的記錄,輸出結(jié)果。 圖23是聯(lián)合查詢的示意圖。共有兩個表, 一個是ORDER(PID, COUNT),另一個是 PRODUCT (ID, PRICE),聯(lián)合查詢的語句是"select PID, COUNT, PRICE from ORDER, PRODUCT where PID = ID",為了處理這個語句,系統(tǒng)首先調(diào)入聯(lián)合鍵所對應的列ORDER的列PID和 PRODUCT的列ID,從這兩個列中尋找合適的記錄,找到了一個合適的組合(PID :POOl,l)和 (ID :P001,5),其中1和5為記錄標識號,然后根據(jù)記錄標識號1和5可以得到相應的連接 數(shù)據(jù)元素,從連接數(shù)據(jù)元素又可以得到值數(shù)據(jù)塊的序列號,通過值數(shù)據(jù)塊的序列號就可以 得到歹lj COUNT和列PRICE的值,這樣就得到結(jié)果(POOl, 5, 20. 99)。 相對于現(xiàn)有的基于行存儲的關系型數(shù)據(jù)庫實現(xiàn)方法,本發(fā)明所提供的基于列存儲 的關系型數(shù)據(jù)庫實現(xiàn)方法,它所建立的索引是稀松索引,這是因為列值已被排序存儲,索引 只建立到數(shù)據(jù)塊,而不是到數(shù)據(jù)塊里存儲的列,當查詢通過索引定位到某一數(shù)據(jù)塊后,就可 以使用二分法查找,這樣的索引就導致了所需的存儲空間很小,維護費用很低,使得數(shù)據(jù)庫 系統(tǒng)可以給所有的列建立索引,數(shù)據(jù)查詢就不會導致全表掃描,從而提高了數(shù)據(jù)庫的查詢 性能。
并且,本發(fā)明的基于列存儲的關系型數(shù)據(jù)庫實現(xiàn)方法也明顯優(yōu)于美國專利 6606638所提供的基于列存儲的方法(1)本發(fā)明實施例中列值排序只是在表段內(nèi)進行,表 段中列值的個數(shù)有一個上限,這樣利用本發(fā)明實現(xiàn)的數(shù)據(jù)庫在數(shù)據(jù)插入上性能穩(wěn)定。(2)本 發(fā)明實施例中的連接數(shù)據(jù)所存儲的是的數(shù)據(jù)塊序列號,這樣,數(shù)據(jù)插入時,盡管列值數(shù)據(jù)的 排序位置會發(fā)生變化,只要它仍然在同一個數(shù)據(jù)塊中,連接數(shù)據(jù)就不需要更新,除非由于數(shù) 據(jù)塊溢出導致值數(shù)據(jù)被移到新的數(shù)據(jù)塊中,在這種情況下,本發(fā)明的方法才要求更新列值 數(shù)據(jù)所相應的連接數(shù)據(jù)。 本領域普通技術人員可以理解實現(xiàn)上述實施例方法中的全部或部分步驟可以通 過程序來指令相關的硬件來完成,該程序可以存儲于一計算機可讀取存儲介質(zhì)中,比如 R0M/RAM、磁碟、光盤等。當程序代碼被機器,如計算機加載且執(zhí)行時,此機器變成用以參與 本發(fā)明的裝置。 圖24為本發(fā)明實施例的實現(xiàn)基于列存儲的關系型數(shù)據(jù)庫系統(tǒng)的裝置的結(jié)構示意 圖,該裝置包括 數(shù)據(jù)文件建立單元,用于建立數(shù)據(jù)文件,并對組成數(shù)據(jù)文件的數(shù)據(jù)塊按順序編序 列號; 表段定義單元,用于根據(jù)計算機內(nèi)存容量定義表段;
記錄插入單元,用于將記錄插入到表段中; 標識號生成單元,對于插入到表段中的記錄生成表段內(nèi)唯一的記錄標識號,并將 記錄按列分開; 列存儲單元,用于存儲記錄中的每一個列,該列存儲單元包括值數(shù)據(jù)存儲單元和 連接數(shù)據(jù)存儲單元,所述值數(shù)據(jù)存儲單元用于將列值和記錄標識號作為值數(shù)據(jù)存儲到數(shù)據(jù) 塊中并按列值大小排序;所述連接數(shù)據(jù)存儲單元用于將記錄標識號和存儲值數(shù)據(jù)的數(shù)據(jù)塊 的序列號作為連接數(shù)據(jù)存儲到新的數(shù)據(jù)塊中,并按記錄標識號大小排序;以及 索引建立單元,用于對存儲值數(shù)據(jù)的數(shù)據(jù)塊和存儲連接數(shù)據(jù)的數(shù)據(jù)塊建立索引, 生成索引數(shù)據(jù)塊。所述索引數(shù)據(jù)塊包括索引數(shù)據(jù)元素,索引數(shù)據(jù)元素包括索引鍵和被索引 數(shù)據(jù)塊的序列號,所述被索引數(shù)據(jù)塊包括索引數(shù)據(jù)塊、值數(shù)據(jù)塊和連接數(shù)據(jù)塊,索引數(shù)據(jù)塊 中的索引數(shù)據(jù)元素按照索引鍵大小排序。索引數(shù)據(jù)元素的索引鍵是被索引數(shù)據(jù)塊的第一個 元素的值。如果被索引的數(shù)據(jù)塊是存儲值數(shù)據(jù)的值數(shù)據(jù)塊,那么索引鍵是值數(shù)據(jù)塊中第一 個值數(shù)據(jù)元素的列值;如果被索引的數(shù)據(jù)塊是存儲連接數(shù)據(jù)的連接數(shù)據(jù)塊,那么索引鍵就 是連接數(shù)據(jù)塊中第一個連接數(shù)據(jù)元素的記錄標識號;如果被索引的數(shù)據(jù)塊是索引數(shù)據(jù)塊, 那么索引鍵就是被索引的索引數(shù)據(jù)塊的第一個索引數(shù)據(jù)元素的鍵值。 本實施例中,如果存儲值數(shù)據(jù)的該數(shù)據(jù)塊中已含有相同的列值,則值數(shù)據(jù)存儲單 元合并具有相同列值的記錄標識號成記錄標識號組,其中記錄標識號組中的記錄標識號按 大小排序。 本實施例的裝置還包括更新單元,用于更新記錄的值數(shù)據(jù)元素和/或連接數(shù)據(jù) 元素。 插入或更新記錄時,如果相應數(shù)據(jù)塊溢出,則記錄插入單元或更新單元將最后的 記錄的值數(shù)據(jù)元素或連接數(shù)據(jù)元素移出并通過兄弟數(shù)據(jù)塊或新的數(shù)據(jù)塊來進行存儲。
插入或更新記錄時,若導致記錄標識號被移動到兄弟數(shù)據(jù)塊或新的數(shù)據(jù)塊中,則連接數(shù)據(jù)存儲單元將被移動的該記錄標識號所對應的連接數(shù)據(jù)元素的數(shù)據(jù)塊序列號更新
為所述兄弟數(shù)據(jù)塊或新的數(shù)據(jù)塊的序列號。 索引建立單元對所述新的數(shù)據(jù)塊建立索弓I 。 插入或更新記錄時,如果導致被索引數(shù)據(jù)塊的第一個元素發(fā)生變化,則索引建立 單元根據(jù)被索引數(shù)據(jù)塊的第一個元素的變化更新索引鍵。 本實施例的裝置還可包括刪除單元,用于刪除記錄的值數(shù)據(jù)元素和連接數(shù)據(jù)元素。 回收單元,用于在刪除單元刪除記錄后值數(shù)據(jù)塊或連接數(shù)據(jù)塊為空時,回收值數(shù) 據(jù)塊或連接數(shù)據(jù)塊。 刪除單元刪除記錄后,如果導致被索引數(shù)據(jù)塊的第一個元素發(fā)生變化,則索引建 立單元根據(jù)被索引數(shù)據(jù)塊的第一個元素的變化更新索引鍵。 以上所述的具體實施方式
,對本發(fā)明的目的、技術方案和有益效果進行了進一步 詳細說明,所應理解的是,以上所述僅為本發(fā)明的具體實施方式
而已,并不用于限定本發(fā)明 的保護范圍,凡在本發(fā)明的精神和原則之內(nèi),所做的任何修改、等同替換、改進等,均應包含 在本發(fā)明的保護范圍之內(nèi)。
1權利要求
一種實現(xiàn)基于列存儲的關系型數(shù)據(jù)庫的方法,其特征在于,該方法包括步驟1,建立數(shù)據(jù)文件,并對組成數(shù)據(jù)文件的數(shù)據(jù)塊按順序編序列號;步驟2,定義表段;步驟3,將記錄插入到表段中;步驟4,對于插入到表段中的記錄生成表段內(nèi)唯一的記錄標識號,并將記錄按列分開;步驟5,對于記錄中的每一個列,執(zhí)行如下操作將列值和記錄標識號作為值數(shù)據(jù)存儲到數(shù)據(jù)塊中并按列值大小排序;將記錄標識號和存儲值數(shù)據(jù)的數(shù)據(jù)塊的序列號作為連接數(shù)據(jù)存儲到新的數(shù)據(jù)塊中,并按記錄標識號大小排序;步驟6、對存儲值數(shù)據(jù)的數(shù)據(jù)塊和存儲連接數(shù)據(jù)的數(shù)據(jù)塊建立索引,生成索引數(shù)據(jù)塊。
2. 根據(jù)權利要求1所述的方法,其特征在于每個表段容納固定數(shù)量的記錄。
3. 根據(jù)權利要求1所述的方法,其特征在于所述步驟3中,如果表段容納的記錄數(shù)達到最大記錄數(shù),則建立新的表段。
4. 根據(jù)權利要求1所述的方法,其特征在于,將列值和記錄標識號作為值數(shù)據(jù)存儲到數(shù)據(jù)塊中并按列值大小排序的步驟中,如果該數(shù)據(jù)塊中已含有相同的列值,合并具有相同列值的記錄標識號成記錄標識號組,其中記錄標識號組中的記錄標識號按大小排序。
5. 根據(jù)權利要求1所述的方法,其特征在于,步驟6中,所述索引數(shù)據(jù)塊包括索引數(shù)據(jù)元素,索引數(shù)據(jù)元素包括索引鍵和被索引數(shù)據(jù)塊的序列號,所述被索引數(shù)據(jù)塊包括索引數(shù)據(jù)塊、值數(shù)據(jù)塊和連接數(shù)據(jù)塊,索引數(shù)據(jù)塊中的索引數(shù)據(jù)元素按照索引鍵大小排序。
6. 根據(jù)權利要求5所述的方法,其特征在于索引數(shù)據(jù)元素的索引鍵是被索引數(shù)據(jù)塊的第一個元素的值。
7. 根據(jù)權利要求6所述的方法,其特征在于如果被索引的數(shù)據(jù)塊是存儲值數(shù)據(jù)的值數(shù)據(jù)塊,那么索引鍵是值數(shù)據(jù)塊中第一個值數(shù)據(jù)元素的列值;如果被索引的數(shù)據(jù)塊是存儲連接數(shù)據(jù)的連接數(shù)據(jù)塊,那么索引鍵就是連接數(shù)據(jù)塊中第一個連接數(shù)據(jù)元素的記錄標識號;如果被索引的數(shù)據(jù)塊是索引數(shù)據(jù)塊,那么索引鍵就是被索引的索引數(shù)據(jù)塊的第一個索引數(shù)據(jù)元素的鍵值。
8. 根據(jù)權利要求1-7中任意一項所述的方法,其特征在于,該方法還包括更新記錄的值數(shù)據(jù)元素和/或連接數(shù)據(jù)元素。
9. 根據(jù)權利要求8所述的方法,其特征在于插入或更新記錄時,如果相應數(shù)據(jù)塊溢出,則將最后的值數(shù)據(jù)元素和/或連接數(shù)據(jù)元素移出并通過兄弟數(shù)據(jù)塊或新的數(shù)據(jù)塊來進行存儲。
10. 根據(jù)權利要求9所述的方法,其特征在于插入或更新記錄時,若導致記錄標識號被移動到兄弟數(shù)據(jù)塊或新的數(shù)據(jù)塊中,將被移動的該記錄標識號所對應的連接數(shù)據(jù)元素的數(shù)據(jù)塊序列號更新為所述兄弟數(shù)據(jù)塊或新的數(shù)據(jù)塊的序列號。
11. 根據(jù)權利要求10所述的方法,其特征在于對所述新的數(shù)據(jù)塊建立索引。
12. 根據(jù)權利要求6所述的方法,其特征在于插入或更新記錄時,如果導致被索引數(shù)據(jù)塊的第一個元素發(fā)生變化,則根據(jù)被索引數(shù)據(jù)塊的第一個元素的變化更新索引鍵。
13. 根據(jù)權利要求1-7中任意一項所述的方法,其特征在于,該方法還包括刪除記錄的值數(shù)據(jù)元素和連接數(shù)據(jù)元素。
14. 根據(jù)權利要求13所述的方法,其特征在于如果刪除記錄后值數(shù)據(jù)塊或連接數(shù)據(jù)塊為空,則回收值數(shù)據(jù)塊或連接數(shù)據(jù)塊。
15. 根據(jù)權利要求13所述的方法,其特征在于如果刪除記錄后導致被索引數(shù)據(jù)塊的第一個元素發(fā)生變化,則根據(jù)被索引數(shù)據(jù)塊的第一個元素的變化更新索引鍵。
16. —種實現(xiàn)基于列存儲的關系型數(shù)據(jù)庫的裝置,其特征在于,該裝置包括數(shù)據(jù)文件建立單元,用于建立數(shù)據(jù)文件,并對組成數(shù)據(jù)文件的數(shù)據(jù)塊按順序編序列號;表段定義單元,用于定義表段;記錄插入單元,用于將記錄插入到表段中;標識號生成單元,對于插入到表段中的記錄生成表段內(nèi)唯一的記錄標識號,并將記錄按列分開;列存儲單元,用于存儲記錄中的每一個列,該列存儲單元包括值數(shù)據(jù)存儲單元和連接數(shù)據(jù)存儲單元,所述值數(shù)據(jù)存儲單元用于將列值和記錄標識號作為值數(shù)據(jù)存儲到數(shù)據(jù)塊中并按列值大小排序;所述連接數(shù)據(jù)存儲單元用于將記錄標識號和存儲值數(shù)據(jù)的數(shù)據(jù)塊的序列號作為連接數(shù)據(jù)存儲到新的數(shù)據(jù)塊中,并按記錄標識號大小排序;以及索引建立單元,用于對存儲值數(shù)據(jù)的數(shù)據(jù)塊和存儲連接數(shù)據(jù)的數(shù)據(jù)塊建立索引,生成索引數(shù)據(jù)塊。
17. 根據(jù)權利要求16所述的裝置,其特征在于每個表段容納固定數(shù)量的記錄。
18. 根據(jù)權利要求16所述的裝置,其特征在于所述記錄插入單元在向表段插入記錄時,如果表段容納的記錄數(shù)達到最大記錄數(shù),則建立新的表段。
19. 根據(jù)權利要求16所述的裝置,其特征在于如果存儲值數(shù)據(jù)的該數(shù)據(jù)塊中已含有相同的列值,則值數(shù)據(jù)存儲單元合并具有相同列值的記錄標識號成記錄標識號組,其中記錄標識號組中的記錄標識號按大小排序。
20. 根據(jù)權利要求16所述的裝置,其特征在于所述索引數(shù)據(jù)塊包括索引數(shù)據(jù)元素,索引數(shù)據(jù)元素包括索引鍵和被索引數(shù)據(jù)塊的序列號,所述被索引數(shù)據(jù)塊包括索引數(shù)據(jù)塊、值數(shù)據(jù)塊和連接數(shù)據(jù)塊,索引數(shù)據(jù)塊中的索引數(shù)據(jù)元素按照索引鍵大小排序。
21. 根據(jù)權利要求20所述的裝置,其特征在于索引數(shù)據(jù)元素的索引鍵是被索引數(shù)據(jù)塊的第一個元素的值。
22. 根據(jù)權利要求21所述的裝置,其特征在于如果被索引的數(shù)據(jù)塊是存儲值數(shù)據(jù)的值數(shù)據(jù)塊,那么索引鍵是值數(shù)據(jù)塊中第一個值數(shù)據(jù)元素的列值;如果被索引的數(shù)據(jù)塊是存儲連接數(shù)據(jù)的連接數(shù)據(jù)塊,那么索引鍵就是連接數(shù)據(jù)塊中第一個連接數(shù)據(jù)元素的記錄標識號;如果被索引的數(shù)據(jù)塊是索引數(shù)據(jù)塊,那么索引鍵就是被索引的索引數(shù)據(jù)塊的第一個索引數(shù)據(jù)元素的鍵值。
23. 根據(jù)權利要求16-22中任意一項所述的裝置,其特征在于,該裝置還包括更新單元,用于更新記錄的值數(shù)據(jù)元素和/或連接數(shù)據(jù)元素。
24. 根據(jù)權利要求23所述的裝置,其特征在于插入或更新記錄時,如果相應數(shù)據(jù)塊溢出,則記錄插入單元或更新單元將最后的記錄的值數(shù)據(jù)元素或連接數(shù)據(jù)元素移出并通過兄弟數(shù)據(jù)塊或新的數(shù)據(jù)塊來進行存儲。
25. 根據(jù)權利要求23所述的裝置,其特征在于插入或更新記錄時,若導致記錄標識號被移動到兄弟數(shù)據(jù)塊或新的數(shù)據(jù)塊中,則連接數(shù)據(jù)存儲單元將被移動的該記錄標識號所對應的連接數(shù)據(jù)元素的數(shù)據(jù)塊序列號更新為所述兄弟數(shù)據(jù)塊或新的數(shù)據(jù)塊的序列號。
26. 根據(jù)權利要求25所述的裝置,其特征在于索引建立單元對所述新的數(shù)據(jù)塊建立索引。
27. 根據(jù)權利要求21所述的裝置,其特征在于插入或更新記錄時,如果導致被索引數(shù)據(jù)塊的第一個元素發(fā)生變化,則索引建立單元根據(jù)被索引數(shù)據(jù)塊的第一個元素的變化更新索引鍵。
28. 根據(jù)權利要求16-22中任意一項所述的裝置,其特征在于,該裝置還包括刪除單元,用于刪除記錄的值數(shù)據(jù)元素和連接數(shù)據(jù)元素。
29. 根據(jù)權利要求28所述的裝置,其特征在于,該裝置還包括回收單元,用于在刪除單元刪除記錄后值數(shù)據(jù)塊或連接數(shù)據(jù)塊為空時,回收值數(shù)據(jù)塊或連接數(shù)據(jù)塊。
30. 根據(jù)權利要求28所述的裝置,其特征在于刪除單元刪除記錄后,如果導致被索引數(shù)據(jù)塊的第一個元素發(fā)生變化,則索引建立單元根據(jù)被索引數(shù)據(jù)塊的第一個元素的變化更新索引鍵。
全文摘要
一種實現(xiàn)基于列存儲的關系型數(shù)據(jù)庫的方法及裝置,所述方法包括建立數(shù)據(jù)文件,并對組成數(shù)據(jù)文件的數(shù)據(jù)塊按順序編序列號;定義表段;將記錄插入到表段中;對于插入到表段中的記錄生成表段內(nèi)唯一的記錄標識號,并將記錄按列分開;對于記錄中的每一個列,執(zhí)行如下操作將列值和記錄標識號作為值數(shù)據(jù)存儲到數(shù)據(jù)塊中并按列值大小排序;將記錄標識號和存儲值數(shù)據(jù)的數(shù)據(jù)塊的序列號作為連接數(shù)據(jù)存儲到新的數(shù)據(jù)塊中,并按記錄標識號大小排序;對存儲值數(shù)據(jù)的數(shù)據(jù)塊和存儲連接數(shù)據(jù)的數(shù)據(jù)塊建立索引,生成索引數(shù)據(jù)塊。本發(fā)明實施例提高了數(shù)據(jù)庫的查詢性能。
文檔編號G06F17/30GK101751406SQ20081018722
公開日2010年6月23日 申請日期2008年12月18日 優(yōu)先權日2008年12月18日
發(fā)明者趙偉 申請人:趙偉
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點贊!
1