一种实现基于列存储的关系型数据库的方法及装置的制作方法

文档序号:6468831阅读:120来源:国知局
专利名称:一种实现基于列存储的关系型数据库的方法及装置的制作方法
技术领域
本发明关于关系型数据库的存储技术,具体地讲是一种实现基于列存储的关系型
数据库的方法及装置。
背景技术
关系型数据库是一个用以存储及处理结构化数据的软件系统,它含有两种数据一种是逻辑数据,它是由表、记录等组成;另一种是物理数据,它代表数据库怎样存储逻辑数据。不同的关系数据库系统或许有相同的逻辑数据,但它们通常有不同的物理数据。实现数据库物理数据的方法有两种一是基于行存储,另一是基于列存储。对于基于行存储的实现方法,它把逻辑数据表的整个记录存储到文件的数据块中,为了提高查询速度,为某些列建立B+树等类型的索引;对于基于列存储的实现方法,逻辑数据表中的记录不直接映射到物理数据中,而是把记录按列分开,把所有记录同一列的值存在一起,同时提供连接数据能够把记录相应的列值重新组合起来形成记录。 其中,基于行存储的关系型数据库和基于列存储的数据库相比在数据查询性能上有劣势,查询时,它不能只读取部分列,因为数据读取是以数据块为基本单位,所有的列都读取到内存中然后再去掉不需要的列,这样就导致产生了很多不必要的硬盘输入输出,从而影响了数据库的查询性能。而对于基于列存储的关系型数据库,由于它把记录的列分开存储,不同的列存储在不同的数据块中,这样查询引擎就可以按需读取列,从而减少了硬盘输入输出,提高了数据库的查询性能。 在实现本发明过程中,发明人发现现有技术中至少存在如下问题基于行存储的关系型数据库所提供的索引一般都是稠密索引,如B+树索引,即每一条记录的列值都必须被加入索引中,这有两方面的缺点一是增加数据库系统所用的存储空间,二是增加数据更新时的性能。正是由于这两方面的问题,在基于行存储的关系型数据库中,难以为数据表中的所有列都建立索引,这样就出现了下面的问题,如果一个查询语句是基于一个未加索引的列查询,系统不得不做全表扫描,导致数据库的性能恶化。 而现有技术中基于列存储的关系型数据库也具有缺陷,第一是它没有对记录进行分段存储的概念,这样就导致排序是在所有的插入列值之间进行,值越多,插入就越慢,第二是现有技术对连接数据要求记录列值数据排序的位置,并且要求只要是列值数据的排序位置发生变化,就要更新连接数据,这样就导致数据插入时会出现大量的数据更新,从而影响性能。 专利号为US6606638,发明名称为"Value-instance-co騰ctivitycomputer-implemented database"的美国专利提出了一个通过给列值排序实现数据库的方法,其公开的内容合并于此以作为本发明的现有技术。

发明内容
本发明的目的在于提供一种实现基于列存储的关系型数据库的方法及装置,以减少硬盘的输入输出,并提高数据库的查询性能。 为了实现上述目的,本发明实施例的实现基于列存储的关系型数据库的方法包括 步骤1,建立数据文件,并对组成数据文件的数据块按顺序编序列号; 步骤2,定义表段; 步骤3,将记录插入到表段中; 步骤4,对于插入到表段中的记录生成表段内唯一的记录标识号,并将记录按列分开; 步骤5,对于记录中的每一个列,执行如下操作 将列值和记录标识号作为值数据存储到数据块中并按列值大小排序; 将记录标识号和存储值数据的数据块的序列号作为连接数据存储到新的数据块
中,并按记录标识号大小排序; 步骤6、对存储值数据的数据块和存储连接数据的数据块建立索引,生成索引数据块。 本发明实施例的实现基于列存储的关系型数据库的装置包括 数据文件建立单元,用于建立数据文件,并对组成数据文件的数据块按顺序编序
列号; 表段定义单元,用于定义表段; 记录插入单元,用于将记录插入到表段中; 标识号生成单元,对于插入到表段中的记录生成表段内唯一的记录标识号,并将记录按列分开; 列存储单元,用于存储记录中的每一个列,该列存储单元包括值数据存储单元和连接数据存储单元,所述值数据存储单元用于将列值和记录标识号作为值数据存储到数据块中并按列值大小排序;所述连接数据存储单元用于将记录标识号和存储值数据的数据块的序列号作为连接数据存储到新的数据块中,并按记录标识号大小排序;以及 索引建立单元,用于对存储值数据的数据块和存储连接数据的数据块建立索引,生成索引数据块。 本发明实施例中记录的列可以按需读取,不相关的列无需被读取,这样和基于行存储的关系型数据库系统相比,就减少了硬盘输入输出,提高了数据库的查询性能。


此处所说明的附图用来提供对本发明的进一步理解,构成本申请的一部分,并不
构成对本发明的限定。在附图中 图l为本发明的主流程图。
图2为数据文件的示意图。 图3为表的逻辑结构和它的内容的示意图。 图4为表段的示意图。 图5为把记录按列分开的示意图。 图6为插入值数据元素到值数据块的示意图。
6
图7为插入具有相同列值的值数据元素到值数据块的示意图。
图8为插入连接数据元素的示意图。 图9为插入值数据元素导致值数据元素移动的示意图。 图10为值数据块的通用查询索引树的示意图。
图11为连接数据块的通用查询索引树的示意图。 图12为插入连接数据元素导致索引更新的示意图。 图13为删除连接数据元素导致索引更新的示意图。 图14为插入连接数据元素导致数据块分裂及索引更新的示意图。 图15为插入值数据元素导致数据块分裂及索引更新的示意图。 图16为插入值数据元素导致值数据元素移动和索引更新的示意图。 图17插入记录到空的表段中的示意图。 图18插入记录到非空的表段中的示意图。 图19为更新记录的示意图。 图20为删除记录并回收记录标识号的示意图。 图21为数据库表投影操作的示意图。 图22为数据库表条件查询操作的示意图。 图23为数据库表联合查询操作的示意图。 图24为本发明实施例的实现基于列存储的关系型数据库系统的装置的结构示意图。
具体实施例方式
为使本发明的目的、技术方案和优点更加清楚明白,下面结合实施方式和附图,对本发明做进一步详细说明。在此,本发明的示意性实施方式及其说明用于解释本发明,但并不作为对本发明的限定。 本发明提供了一个实现基于列存储的关系型数据库系统的非常有效的方法,该方法中 首先建立数据文件,数据文件由一序列固定大小的数据块组成,对数据块编序列号,序列号从零开始,依次增加。 然后定义表段,可根据计算机的内存大小定义好表段,内存越大,表段中所能存储的记录数就越大,具体的比率关系可以预先设置。记录被以下操作存储到一个表段中
1)首先产生一个表段中唯一的正整数为记录标识号。
2)把记录分成列,对于每一个列,做以下操作 2. 1)存储列值和记录标识号到数据块中并按列值大小排序,这种数据被引用为"值数据"。如果数据块中已含有相同的列值,合并具有相同列值的记录标识号成记录标识号组,其中记录标识号组中的记录标识号按大小排序,存储这类数据的数据块被引用为"值数据块",而值数据块中的数据元素被引用为"值数据元素"。 2. 2)把记录标识号和存储值数据的数据块序列号按记录标识号排序存储到新的数据块中,这种数据被引用为"连接数据",而存储连接数据的数据块被引用为"连接数据块"。连接数据可以用来把相应的值数据连接起来而形成一条记录。
为值数据块和连接数据块都建立通用查询索引树,索引树是由数据块组成,被引
用为"索引数据块",索引数据块是由索引数据元素组成,而索引数据元素又由索引键和被
索引的数据块序列号组成。在索引数据块中,索引数据元素按照索引键大小排序。索引数
据元素的索引键是被索引数据块的第一个元素的值如果被索引的数据块是值数据块,那
么索引键是值数据块中第一个值数据元素的列值;如果被索引的数据块是连接数据块,那
么索引键就是连接数据块中第一个连接数据元素的记录标识号;如果被索引的数据块是索
引数据块,那么索引键就是被索引的索引数据块的第一个索引数据元素的键值。由于索引
只建立到数据块级,这样的索引树只占很小的存储空间,被引用为"稀松索引"。 如果插入或更新记录的列值数据导致数据块溢出,部分值数据元素不得不被移到
新的值数据块中,那么,其相应的连接数据元素的值数据块序列号必须被更新为新的值数
据块的序列号来反映这些变化。 由于所有的列值数据都有通用查询索引,基于任何列的查询都不会导致全表扫描,并且,由于记录的列被分开存储,查询时,记录的列可以按需读取,不相关的列无需被读取,这样和基于行存储的关系型数据库系统相比,就减少了硬盘输入输出,提高了数据库的查询性能。 下面对本发明实施例进行更具体地说明。
图1为本发明的主流程图,如图所示,该方法包括 步骤110,建立数据文件。本实施例中,数据文件是由一序列固定大小的数据块组成,对数据块从零开始进行编号依次增加,这个编号引用为"数据块序列号"。为了得到数据块在数据文件中的位置,以字节为单位,可用以下程式计算位置=数据块序列号X数据块字节数。 图2是数据文件的示意图,数据文件由n个固定大小的数据块组成,每一个数据块有一个序列号,从零开始。当数据文件由于数据的存储导致所有的数据块被占用满时,系统自动扩充新的数据块给数据文件,用来容纳新的数据。 步骤120,根据计算机的内存容量大小定义好表段,该表段用来存储表的记录。表段中可容纳的最大记录数和计算机内存大小成正比,比率可以设置。比如可以设为1G内存对应一百万条记录,如果计算机内存是2G,那么表段可容纳的最大记录数是二百万。这样,四百万条记录就被分成两个表段,每个表段含有二百万条记录。 图3是一个数据库表的逻辑结构的示意图,它是由三个列组成ID, NAME和PRICE,它共有四条记录(POOl, Radio, 10. 99) , (P002, Pen, 1. 99) , (P003, TV,200. 99)和(P004,Camera,100. 99)。 图4是一个表段的示意图。该表段最大可容纳的记录数是二,插入四条记录后,生成了两个表段,每一个表段含有两条记录。表段1含有记录(P001,Radio,10. 99)和(P002,Pen, 1. 99)。表段2含有记录(P003, TV,200. 99)和(P004, Camera, 100. 99)。表段中的记录可以用列值数据中的记录标识号进行连接组建,比如,在表段1中,列"ID"的值数据元素(P001, 1)可以和列"NAME"的值数据元素(Radio, 1)相连,再和列"PRICE"的值数据元素(10. 99, 1)相连,这样就组成了记录(P001, Radio, 10. 99)。记录标识号1,2只在各自的表段中唯一。 步骤130,将表的记录插入到当前定义的表段中。当由于持续插入记录导致当前表
8段达到它的最大记录数时,重复步骤2建立新的表段用以插入新的记录。 步骤140,对于插入到表段中的记录,系统产生一个在表段中唯一的正整数作为记
录的标识号,同时,把记录按列分开。 图5是把表段中的记录按列分开的示意图。记录为(P001,Radio, 10. 99),它的列分别为ID, NAME, PRICE,把记录按这三个列分开,分别为:(P001) , (Radio) , (10. 99)。
步骤150,对于记录的每一个列,作以下存储操作存储值数据和连接数据。[OO72] (1)存储值数据 存储列值和记录标识号到数据块中并按列值大小排序,这种数据称为值数据。如果数据块中已含有相同的值,合并相应的记录标识号成记录标识号组,其中记录标识号组中的记录标识号按大小排序,存储这类数据的数据块称为值数据块,而值数据块中的数据元素叫值数据元素。 值数据块是由值数据元素组成,而值数据元素有两种一种是简单值数据元素,它是由一个列值和一个记录标识号构成,用以表示列值只被一条记录引用;另一种是复合数据元素,它是由一个列值和一个记录标识号组构成,并且记录标识号组中的记录标识号按照记录标识号的大小排序,它是用以表示多条记录含有相同的列值。值数据块中的值数据元素按照值数据元素的列值进行排序存储。为了提高查询速度,值数据块可以建立映射记录标识号到列值的哈希表,当需要查询一个记录标识号所对应的列值时,利用哈希表就可以快速查询到结果。 图6是一个插入值数据元素到值数据块中的示意图,在插入值数据元素(TV,3)之前,值数据块是由两个简单值数据元素组成(Camera, 1)和(Pen, 2),它们按照值排序Camera, Pen。插入值数据元素(TV,3)后,值数据块变成由三个简单数据元素组成(Camera, 1) , (Pen, 2)和(TV, 3),它们是按照值进行排序:C謙ra, Pen, TV。
图7是一个插入具有相同列值的值数据元素到值数据块中的示意图,在插入值数据元素(Camera, 3)之前,值数据块是由两个简单值数据元素组成(Camera, 1)和(Pen,2),由于值数据块已含有列值为Camera的值数据元素,插入值数据元素(Camera, 3)就导致值数据块产生复合值数据元素,因此,插入后,值数据块变成了含有一个复合数据元素(Camera, 13)和一个简单值数据元素(Pen, 2)。其中复合数据元素(Camera, 13)中的记录标识号组是按照记录标识号大小排序1,3。[OO77] (2)存储连接数据 存储记录标识号和数据块序列号到新的数据块中并按记录标识号大小进行排序,其中数据块序列号是指l)中存储记录标识号所相应的值数据元素的数据块的序列号。存储这类数据的数据块称为连接数据块,插入在连接数据块中形成的数据元素被称为连接数据元素。 连接数据块是由连接数据元素组成,连接数据元素是由一个记录标识号和一个数据块序列号组成,其中值数据块序列号是存储记录标识号所相应的值数据元素的值数据块的序列号。连接数据块中的连接数据元素按照记录标识号的大小进行排序存储,可用二分法查找一个给定记录标识号的值数据块序列号。由于连接数据元素含有存储值数据的数据块序列号,它可以用来定位值数据元素。 图8是一个插入连接数据元素到连接数据块的示意图。它是列NAME的连接数据块,在插入连接数据元素(3, 1002)之前,共含有两个连接数据元素(l,匪)和(2, 1001),其中连接数据元素是按照记录标识号进行排序1,2,插入新的连接数据元素(3,1002)后,共含有三个连接数据元素(1, 1001), (2, 1001)和(3,1002),其中连接数据元素是按照记录标识号进行排序1,2,3。连接数据元素(1, 1001)表示标识号为1的记录的列值被存储在数据块1001中,连接数据元素(2,1001)表示标识号为2的记录的列值被存储在数据块1001中,连接数据元素(3,1002)表示标识号为3的记录的列值被存储在数据块1002中。
步骤160,如果插入或更新列值导致其它已存储的记录标识号被移到新的数据块中,需要更新这些被移动的记录标识号所对应的连接数据元素的数据块序列号为新的数据块的序列号。 图9是一个插入值数据导致值数据元素被移到新的数据块中的示意图。在插入值数据元素(Radio, 3)之前,值数据块含有两个简单值数据元素(Camera, 1)和(TV,2),和它们相应的连接数据元素分别为(1,2002)和(2,2002),表示记录1和记录2的列值都存储在值数据块2002中。插入(Radio, 3)后,假设值数据块溢出,值数据元素(TV,2)不得不移出来使得值数据块2002不再溢出,同时建立了一个新的值数据块2003来存储移出的值数据元素(TV,2)。由于值数据元素的移动,它所相应的连接数据元素的值数据块序列号要被更新成新的值数据块序列号连接数据元素(2,2002)被更新成(2,2003)来表示它所对应的值数据元素被移到了值数据块2003中。同时值数据块2003就成了值数据块2002的兄弟数据块。 步骤170,对存储的数据块建立索引。为了提高对值数据元素和连接数据元素的查询速度,值数据块和连接数据块都建立有通用查询索引树,它一般是由根、中间及叶索引数据块组成,而每一个索引数据块由索引数据元素组成,每一个索引数据元素又由一个索引键和一个数据块序列号组成,其中数据块序列号所指向的数据块可以是索引数据块,值数据块和连接数据块,这些被指向的数据块称为被索引数据块,为了表现索引与被索引数据块之间的关系,被索引数据块称为子数据块,而其相应的索引数据块称为父数据块,没有父数据块的索引数据块被称为根索引数据块,所索引的数据块是值数据块或者连接数据块的索引数据块被称为叶数据块,其他类型的索引数据块被称为中间索引数据块。索引数据元素的键是它所索引的数据块的第一个元素的值如果被索引的数据块是索引数据块,索引键就是数据块存储的第一个索引数据元素中的索引键;如果被索引的数据块是值数据块,索引键就是数据块中存储的第一个值数据元素中的列值;如果被索引的数据块是连接数据块,索引键就是数据块中存储的第一个连接数据元素中的记录标识号。索引数据块中存储的索引数据元素是按照键的大小排序。 图IO是一个值数据块的通用查询索引树的示意图。叶索引数据块中含有两个索引数据元素第一个索引数据元素含有键"Camera",而第二个索引数据元素含有键"Radio",它们都是各自索引的值数据块的第一个值数据元素的列值。 图11是一个连接数据块的通用查询索引树的示意图。叶索引数据块含有两个索引数据元素,第一个索引数据元素含有键"1",第二个索引数据元素含有键"7",它们都是各自索引的连接数据块的第一个连接数据元素的记录标识号。 如果更新数据导致索引数据元素所索引的数据块的第一个元素发生变化,索引数据元素的键必须更新为新的键值来反映这个变化。如果,插入新的数据导致数据块溢出,即数据元素占用的存储空间超过了数据块的容量,最后的数据元素需要被移出以使得数据
块不再溢出。被移出的数据元素可以移到兄弟数据块中如果兄弟数据块有足够的空间容纳
它,否则,需要建立新的数据块来存储,新的数据块需要被加入到索引树中。 图12是插入连接数据元素导致索引更新的示意图。插入新的连接数据元素(6,
2000)导致(6,2000)成为数据块的新的第一个元素,其相应的索引需要更新来反映这个变
化,从而索引数据元素的键7更新成为6。 图13是删除连接数据元素导致索引更新的示意图。连接数据元素(1, 1001)被从 连接数据块中删除,(3,1002)成为新的第一个数据元素,它所相应的索引数据元素的键需 要被从1更新成3来反映这个变化。 图14是一个插入新的连接元素导致连接数据块溢出的示意图。插入(2,1001)导
致连接数据块溢出,连接数据元素(3,1002)被移出,由于它的兄弟数据块没有足够的空闲
空间来接纳(3,1002),系统就生成一个新的连接数据块,连接数据元素(3,1002)被移到新
的连接数据块中,索引数据块中需要加入一个新的索引数据元素来索引新的连接数据块。 图15是一个插入新的值数据元素导致值数据块溢出的示意图。插入(Apple,6)
导致值数据块溢出,简单数据元素(Cookie, 3)被移出,但由于它的兄弟数据块没有足够的
空闲空间,这样,系统就生成一个新的值数据块,(Cookie, 3)被移到新的值数据块中,索引
数据块中需要加入一个新的索引数据元素来索引新的连接数据块,同时由于(Apple,6)成
为新的第一个数据元素,其所相应的索引数据元素需要更新索引键为Apple。 图16是插入新的值数据元素导致值数据块溢出的示意图。新的值数据元素
(Apple,6)被插入到值数据块中,导致值数据块溢出,值数据块的最后一个值数据元素
(Cookie, 3)需要被移出,它被移入兄弟值数据块中,这是因为兄弟值数据块有足够的空
间来接纳它,这就导致兄弟值数据块的第一个元素发生变化。由于插入(Apple,6)导致
第一个值数据块的第一个元素发生了变化,它所相应的索引数据元素的键需要被更新成
"Apple",而兄弟值数据块的第一个元素也发生了变化,它所相应的数据索引数据元素需要
被更新成"Cookie",而由于索引数据块的第一个索引数据元素的键发生了变化,它所相应
的索引数据元素的键也需要更新成"Apple"来反映这些变化。 利用图1所示的流程所建立的关系型数据库的基本的数据库操作包括 (1)插入 当插入一个新的记录时,首先检查当前的表段中的记录数是否达到最大,如果是 达到最大,需要建立新的表段来接受新的记录。当插入记录r(c0,cl,…,cn)(c0,cl,, cn表示记录的n个列值)到一个表段中,系统生成一个正整数id作为记录的标识号,id在 表段中唯一,然后把记录按照列分开,对于每一个列ci,插入值数据元素(ci, id),如果数 据块中已含有列值ci,合并记录标识号成一个组来生成一个复合值数据元素(ci,id idl… idk),其中id0,idl,…,idk按大小排序。记录下记录标识号被插入的数据块的序列号,假 设是vid,接下来,插入链接数据元素(id,vid)到连接数据块中。 如果插入记录导致值数据块或者连接数据块的第一个元素发生变化,它们所相应 的索引需要更新来反映这些变化。 如果插入记录导致值数据块或连接数据块溢出,那么溢出数据块的最后的数据元 素需要移出来减少数据块元素的所用空间,使得数据块不再溢出,移出的数据元素可以被
11移到兄弟数据块中如果兄弟数据块有足够的空闲空间,否则,需要建立新的数据块来接受 移出的数据元素。索引树需要更新来反映这些变化,具体操作参见前面关于通用查询索引 树的有关描述。 图17是一个关于插入记录到一个空的表段的示意图。记录是(P001,TV,100.99), 表段生成的记录标识号是1,然后把记录按照列分成(P001), (TV), (100.99),再分别插入 这三个列的值数据元素和列数据元素。系统生成新的值数据块和新的连接数据块来接受这 些值。其中值数据块1001含有值数据元素(P001, 1),值数据块1002含有值数据元素(TV, 1),值数据块1003含有值数据元素(100.99,1)。第一个连接数据块含有(1,1001),第二个 连接数据块含有(1,1002),第三个连接数据块含有(1,1003)。连接(P001,1), (TV,l)和 (100. 99, 1)可得到记录(P001, TV, 100. 99)。 图18是插入记录到一个非空的表段的示意图。表段中已含有记录(P001, TV, 100. 99),插入记录(P002, Camera, 50. 99),表段生成了新的记录标识号2,记录被按列分 开插入到表段中,包括值数据元素和连接数据元素。插入后,值数据块1001含有(POOl, 1) , (P002, 2),值数据块1002含有:(Camera, 2) , (TV, 1),值数据块1003含有:(50. 99, 2), (100.99,1);连接数据块1含有(1, 1001), (2,1001),连接数据块2含有(1,1002), (2, 1002),连接数据块含有(1, 1003) , (2, 1003)。值数据块中的值数据元素是按照列值排序存 储,而连接数据块中的连接数据元素是按照记录标识号排序存储。连接(POOl,l), (TV,l), (100.99,1)得到记录(POOl, TV, 100. 99),连接(P002,2), (Camera, 2), (50.99,2)得到记 录(P002, Camera,50. 99)。 [OO"] (2)更新 更新记录的列值是通过删除旧的值数据元素和插入新的值数据元素来完成,如果 值数据元素被插入到的值数据块和旧的值数据元素所在的值数据块不同,那么它所相应的 连接数据元素中的数据块序列号就要更新成新的数据块序列号。 如果更新记录导致值数据块或连接数据块的第一个数据元素发生变化,相应的索 引树需要更新来反映这些变化。 如果更新记录导致值数据块或连接数据块溢出,那么数据块的最后的数据元素需 要移出来使得数据块不再溢出,而移出的数据元素可以移到兄弟数据块中如果兄弟数据块 有足够的空闲空间,否则,需要生成新的数据块来接受溢出的数据元素。索引树需要更新来 反映这些变化。 图19是记录更新的示意图。更新记录(P001,TV, 100.99)的列PRICE为40. 99,首 先,值数据元素(100. 99, 1)被从值数据块1003中删除,然后插入新的值数据元素(40. 99, 1),这样值数据块画就含有数据元素:(40. 99, 1) , (50. 99, 2),由于值数据块1003的第一 个数据元素发生了变化,其相应的索引树需要更新。又由于新的值数据元素还在同一个值 数据块中,无需更新连接数据块。
(3)删除 删除记录是通过删除所有列的值数据元素和连接数据元素来处理。首先,对于每 一个列,删除它的连接数据元素,然后,通过连接数据元素的数据库序列号,找到值数据块, 然后删除记录比标识号所对应的值数据元素。如果删除使得值数据块或连接数据块变空, 系统需要回收它们。当记录被删除后,记录标识号需要被回收。
图20是删除记录的示意图。删除记录的ID为P002的记录,首先系统通过ID的 值数据块和它的索引定位到含有P002的值数据块,找到P002所相应的记录标识号是2,从 ID的连接数据块中删除2所对应的连接数据元素,通过连接数据元素得到值数据块序列号 IOOI,定位值数据块,删除值数据元素,采用同样的步骤删除列NAME, PRICE所对应的连接 数据元素和值数据元素,这样就删除了记录(P002, Camera, 50. 99)。 [O107] (4)投影查询 投影查询是指查询表中记录的某些列,由于列是分开存储,这样列就可以按需读 取,而不是象基于行存储的数据库那样需要读取所有列的数据,这样就大大减少了硬盘输 入输出,从而提高了数据库的查询性能。 图21是投影查询的示意图。投影查询语句是"select NAME, PRICE fromPRODUCT",查询引擎按以下方式操作对于列NAME和PRICE,分别读取它们的值数据 块,然后根据记录标识号连接相应的列值,输出结果。列ID的值数据块没有被读取。
(5)条件查询 条件查询是指查询语句有查询条件,系统可以值读取和查询条件相关的列的数 据,一旦记录的列值通过了这些查询条件,所有其他需要输出的列值就被读取,输出到最终 的结果当中。 图22是条件查询的示意图。条件查询的语句是"select NAME, PRICEfrom PRODUCT where PRICE = 100. 99",查询引擎首先利用列PRICE的值数据块的索引来快速 定位含有100. 99的值数据块,找到了记录标识号1,然后用记录标识号1去从列NAME的 连接数据块中寻找相应的连接数据元素,可用连接数据块的通用查询索引树来縮小搜索范 围,找到连接数据块后,用二分法找到记录标识号1所对应的值数据块1002,然后,读取值 数据块1002,利用值数据块的哈希表找到1所对应的列值为TV,这样就得到了记录(TV, 跳99)。 (6)联合查询 联合查询是指需要联合两个表来得到查询结果。系统可以只读入需要联合的键值 所对应的列,然后做联合查询,对于键值可以联合的记录,输出结果。 图23是联合查询的示意图。共有两个表, 一个是ORDER(PID, COUNT),另一个是 PRODUCT (ID, PRICE),联合查询的语句是"select PID, COUNT, PRICE from ORDER, PRODUCT where PID = ID",为了处理这个语句,系统首先调入联合键所对应的列ORDER的列PID和 PRODUCT的列ID,从这两个列中寻找合适的记录,找到了一个合适的组合(PID :POOl,l)和 (ID :P001,5),其中1和5为记录标识号,然后根据记录标识号1和5可以得到相应的连接 数据元素,从连接数据元素又可以得到值数据块的序列号,通过值数据块的序列号就可以 得到歹lj COUNT和列PRICE的值,这样就得到结果(POOl, 5, 20. 99)。 相对于现有的基于行存储的关系型数据库实现方法,本发明所提供的基于列存储 的关系型数据库实现方法,它所建立的索引是稀松索引,这是因为列值已被排序存储,索引 只建立到数据块,而不是到数据块里存储的列,当查询通过索引定位到某一数据块后,就可 以使用二分法查找,这样的索引就导致了所需的存储空间很小,维护费用很低,使得数据库 系统可以给所有的列建立索引,数据查询就不会导致全表扫描,从而提高了数据库的查询 性能。
并且,本发明的基于列存储的关系型数据库实现方法也明显优于美国专利 6606638所提供的基于列存储的方法(1)本发明实施例中列值排序只是在表段内进行,表 段中列值的个数有一个上限,这样利用本发明实现的数据库在数据插入上性能稳定。(2)本 发明实施例中的连接数据所存储的是的数据块序列号,这样,数据插入时,尽管列值数据的 排序位置会发生变化,只要它仍然在同一个数据块中,连接数据就不需要更新,除非由于数 据块溢出导致值数据被移到新的数据块中,在这种情况下,本发明的方法才要求更新列值 数据所相应的连接数据。 本领域普通技术人员可以理解实现上述实施例方法中的全部或部分步骤可以通 过程序来指令相关的硬件来完成,该程序可以存储于一计算机可读取存储介质中,比如 R0M/RAM、磁碟、光盘等。当程序代码被机器,如计算机加载且执行时,此机器变成用以参与 本发明的装置。 图24为本发明实施例的实现基于列存储的关系型数据库系统的装置的结构示意 图,该装置包括 数据文件建立单元,用于建立数据文件,并对组成数据文件的数据块按顺序编序 列号; 表段定义单元,用于根据计算机内存容量定义表段;
记录插入单元,用于将记录插入到表段中; 标识号生成单元,对于插入到表段中的记录生成表段内唯一的记录标识号,并将 记录按列分开; 列存储单元,用于存储记录中的每一个列,该列存储单元包括值数据存储单元和 连接数据存储单元,所述值数据存储单元用于将列值和记录标识号作为值数据存储到数据 块中并按列值大小排序;所述连接数据存储单元用于将记录标识号和存储值数据的数据块 的序列号作为连接数据存储到新的数据块中,并按记录标识号大小排序;以及 索引建立单元,用于对存储值数据的数据块和存储连接数据的数据块建立索引, 生成索引数据块。所述索引数据块包括索引数据元素,索引数据元素包括索引键和被索引 数据块的序列号,所述被索引数据块包括索引数据块、值数据块和连接数据块,索引数据块 中的索引数据元素按照索引键大小排序。索引数据元素的索引键是被索引数据块的第一个 元素的值。如果被索引的数据块是存储值数据的值数据块,那么索引键是值数据块中第一 个值数据元素的列值;如果被索引的数据块是存储连接数据的连接数据块,那么索引键就 是连接数据块中第一个连接数据元素的记录标识号;如果被索引的数据块是索引数据块, 那么索引键就是被索引的索引数据块的第一个索引数据元素的键值。 本实施例中,如果存储值数据的该数据块中已含有相同的列值,则值数据存储单 元合并具有相同列值的记录标识号成记录标识号组,其中记录标识号组中的记录标识号按 大小排序。 本实施例的装置还包括更新单元,用于更新记录的值数据元素和/或连接数据 元素。 插入或更新记录时,如果相应数据块溢出,则记录插入单元或更新单元将最后的 记录的值数据元素或连接数据元素移出并通过兄弟数据块或新的数据块来进行存储。
插入或更新记录时,若导致记录标识号被移动到兄弟数据块或新的数据块中,则连接数据存储单元将被移动的该记录标识号所对应的连接数据元素的数据块序列号更新
为所述兄弟数据块或新的数据块的序列号。 索引建立单元对所述新的数据块建立索弓I 。 插入或更新记录时,如果导致被索引数据块的第一个元素发生变化,则索引建立 单元根据被索引数据块的第一个元素的变化更新索引键。 本实施例的装置还可包括删除单元,用于删除记录的值数据元素和连接数据元素。 回收单元,用于在删除单元删除记录后值数据块或连接数据块为空时,回收值数 据块或连接数据块。 删除单元删除记录后,如果导致被索引数据块的第一个元素发生变化,则索引建 立单元根据被索引数据块的第一个元素的变化更新索引键。 以上所述的具体实施方式
,对本发明的目的、技术方案和有益效果进行了进一步 详细说明,所应理解的是,以上所述仅为本发明的具体实施方式
而已,并不用于限定本发明 的保护范围,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含 在本发明的保护范围之内。
1权利要求
一种实现基于列存储的关系型数据库的方法,其特征在于,该方法包括步骤1,建立数据文件,并对组成数据文件的数据块按顺序编序列号;步骤2,定义表段;步骤3,将记录插入到表段中;步骤4,对于插入到表段中的记录生成表段内唯一的记录标识号,并将记录按列分开;步骤5,对于记录中的每一个列,执行如下操作将列值和记录标识号作为值数据存储到数据块中并按列值大小排序;将记录标识号和存储值数据的数据块的序列号作为连接数据存储到新的数据块中,并按记录标识号大小排序;步骤6、对存储值数据的数据块和存储连接数据的数据块建立索引,生成索引数据块。
2. 根据权利要求1所述的方法,其特征在于每个表段容纳固定数量的记录。
3. 根据权利要求1所述的方法,其特征在于所述步骤3中,如果表段容纳的记录数达到最大记录数,则建立新的表段。
4. 根据权利要求1所述的方法,其特征在于,将列值和记录标识号作为值数据存储到数据块中并按列值大小排序的步骤中,如果该数据块中已含有相同的列值,合并具有相同列值的记录标识号成记录标识号组,其中记录标识号组中的记录标识号按大小排序。
5. 根据权利要求1所述的方法,其特征在于,步骤6中,所述索引数据块包括索引数据元素,索引数据元素包括索引键和被索引数据块的序列号,所述被索引数据块包括索引数据块、值数据块和连接数据块,索引数据块中的索引数据元素按照索引键大小排序。
6. 根据权利要求5所述的方法,其特征在于索引数据元素的索引键是被索引数据块的第一个元素的值。
7. 根据权利要求6所述的方法,其特征在于如果被索引的数据块是存储值数据的值数据块,那么索引键是值数据块中第一个值数据元素的列值;如果被索引的数据块是存储连接数据的连接数据块,那么索引键就是连接数据块中第一个连接数据元素的记录标识号;如果被索引的数据块是索引数据块,那么索引键就是被索引的索引数据块的第一个索引数据元素的键值。
8. 根据权利要求1-7中任意一项所述的方法,其特征在于,该方法还包括更新记录的值数据元素和/或连接数据元素。
9. 根据权利要求8所述的方法,其特征在于插入或更新记录时,如果相应数据块溢出,则将最后的值数据元素和/或连接数据元素移出并通过兄弟数据块或新的数据块来进行存储。
10. 根据权利要求9所述的方法,其特征在于插入或更新记录时,若导致记录标识号被移动到兄弟数据块或新的数据块中,将被移动的该记录标识号所对应的连接数据元素的数据块序列号更新为所述兄弟数据块或新的数据块的序列号。
11. 根据权利要求10所述的方法,其特征在于对所述新的数据块建立索引。
12. 根据权利要求6所述的方法,其特征在于插入或更新记录时,如果导致被索引数据块的第一个元素发生变化,则根据被索引数据块的第一个元素的变化更新索引键。
13. 根据权利要求1-7中任意一项所述的方法,其特征在于,该方法还包括删除记录的值数据元素和连接数据元素。
14. 根据权利要求13所述的方法,其特征在于如果删除记录后值数据块或连接数据块为空,则回收值数据块或连接数据块。
15. 根据权利要求13所述的方法,其特征在于如果删除记录后导致被索引数据块的第一个元素发生变化,则根据被索引数据块的第一个元素的变化更新索引键。
16. —种实现基于列存储的关系型数据库的装置,其特征在于,该装置包括数据文件建立单元,用于建立数据文件,并对组成数据文件的数据块按顺序编序列号;表段定义单元,用于定义表段;记录插入单元,用于将记录插入到表段中;标识号生成单元,对于插入到表段中的记录生成表段内唯一的记录标识号,并将记录按列分开;列存储单元,用于存储记录中的每一个列,该列存储单元包括值数据存储单元和连接数据存储单元,所述值数据存储单元用于将列值和记录标识号作为值数据存储到数据块中并按列值大小排序;所述连接数据存储单元用于将记录标识号和存储值数据的数据块的序列号作为连接数据存储到新的数据块中,并按记录标识号大小排序;以及索引建立单元,用于对存储值数据的数据块和存储连接数据的数据块建立索引,生成索引数据块。
17. 根据权利要求16所述的装置,其特征在于每个表段容纳固定数量的记录。
18. 根据权利要求16所述的装置,其特征在于所述记录插入单元在向表段插入记录时,如果表段容纳的记录数达到最大记录数,则建立新的表段。
19. 根据权利要求16所述的装置,其特征在于如果存储值数据的该数据块中已含有相同的列值,则值数据存储单元合并具有相同列值的记录标识号成记录标识号组,其中记录标识号组中的记录标识号按大小排序。
20. 根据权利要求16所述的装置,其特征在于所述索引数据块包括索引数据元素,索引数据元素包括索引键和被索引数据块的序列号,所述被索引数据块包括索引数据块、值数据块和连接数据块,索引数据块中的索引数据元素按照索引键大小排序。
21. 根据权利要求20所述的装置,其特征在于索引数据元素的索引键是被索引数据块的第一个元素的值。
22. 根据权利要求21所述的装置,其特征在于如果被索引的数据块是存储值数据的值数据块,那么索引键是值数据块中第一个值数据元素的列值;如果被索引的数据块是存储连接数据的连接数据块,那么索引键就是连接数据块中第一个连接数据元素的记录标识号;如果被索引的数据块是索引数据块,那么索引键就是被索引的索引数据块的第一个索引数据元素的键值。
23. 根据权利要求16-22中任意一项所述的装置,其特征在于,该装置还包括更新单元,用于更新记录的值数据元素和/或连接数据元素。
24. 根据权利要求23所述的装置,其特征在于插入或更新记录时,如果相应数据块溢出,则记录插入单元或更新单元将最后的记录的值数据元素或连接数据元素移出并通过兄弟数据块或新的数据块来进行存储。
25. 根据权利要求23所述的装置,其特征在于插入或更新记录时,若导致记录标识号被移动到兄弟数据块或新的数据块中,则连接数据存储单元将被移动的该记录标识号所对应的连接数据元素的数据块序列号更新为所述兄弟数据块或新的数据块的序列号。
26. 根据权利要求25所述的装置,其特征在于索引建立单元对所述新的数据块建立索引。
27. 根据权利要求21所述的装置,其特征在于插入或更新记录时,如果导致被索引数据块的第一个元素发生变化,则索引建立单元根据被索引数据块的第一个元素的变化更新索引键。
28. 根据权利要求16-22中任意一项所述的装置,其特征在于,该装置还包括删除单元,用于删除记录的值数据元素和连接数据元素。
29. 根据权利要求28所述的装置,其特征在于,该装置还包括回收单元,用于在删除单元删除记录后值数据块或连接数据块为空时,回收值数据块或连接数据块。
30. 根据权利要求28所述的装置,其特征在于删除单元删除记录后,如果导致被索引数据块的第一个元素发生变化,则索引建立单元根据被索引数据块的第一个元素的变化更新索引键。
全文摘要
一种实现基于列存储的关系型数据库的方法及装置,所述方法包括建立数据文件,并对组成数据文件的数据块按顺序编序列号;定义表段;将记录插入到表段中;对于插入到表段中的记录生成表段内唯一的记录标识号,并将记录按列分开;对于记录中的每一个列,执行如下操作将列值和记录标识号作为值数据存储到数据块中并按列值大小排序;将记录标识号和存储值数据的数据块的序列号作为连接数据存储到新的数据块中,并按记录标识号大小排序;对存储值数据的数据块和存储连接数据的数据块建立索引,生成索引数据块。本发明实施例提高了数据库的查询性能。
文档编号G06F17/30GK101751406SQ20081018722
公开日2010年6月23日 申请日期2008年12月18日 优先权日2008年12月18日
发明者赵伟 申请人:赵伟
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1