海量数据内存数据库中快速定位的网格+t树索引的方法

文档序号:6556252阅读:195来源:国知局
专利名称:海量数据内存数据库中快速定位的网格+t树索引的方法
技术领域
本发明涉及内存数据库中的数据库系统中建立多维索引的方法,尤其是网格+T树技术在内存数据库中的实现方法。
背景技术
在电信业务支撑系统中,通常需要处理数千万条记录以上的数据,而有限的主机资源(CPU、内存等)是非常宝贵的。如何用最少的资源,较高的效率完成相关的数据库操作是内存数据库技术研究的一个重点,也是一个难点。采用好的索引结构是保证内存数据库操作效率的有效保证。
在对索引结构多年的研究过程中,树形结构一直都是数据库系统中建立多维索引最有效的方法之一,在这些建立多维索引的结构中,比较流行的有k-d树,R树、T树。
k-d树k-d树是一种k维空间中的二叉查找树,它主要存储的是点数据,在每个内部节点中,它用一个k-1维的超平面将节点所表示的k维空间分成两个部分,这些超平面在k个可能的方向上交替出现,而且在每一个超平面中至少要包括一个点数据,图1是一个k-d树的例子。
从操作上来说,k-d树的查找和插入是很简单的,而删除操作则有点复杂,因为一个点的删除可能会导致它的子树重建。由于k-d树只能处理点数据,因此对其他具有一定形状的数据只好用它们的中心点来代替。需要指出的是当数据插入的顺序不同时,k-d树的结构也不同,而且数据会分散出现在树的任何地方,而不会只出现在叶子节点。
由以上介绍可以看出,k-d树是一种多维二叉树结构,因此对于传统基于磁盘的数据库系统,有很好的索引效率。但由于每个节点仅包含一个数据节点和两个指向左右孩子的指针,这对内存空间极为宝贵的内存数据库来说存储效率太低。
R树R树是一种类似于B+树的多维索引结构。它的每个中间节点存储的不是数据,而是所有子节点的最小外接矩形(MBR),实际数据都保存在叶子节点中,所有的叶子节点都出现在同一层上。如图2所示R树的查找算法是从根节点出发,对内部节点,检查每一项是否与要查找的区域重叠,如果重叠,则检查该项所指向的子节点,直至找到叶子节点。插入操作首先从根结点开始,在经过的每一个内部节点中选择为容纳下插入节点其MBR的面积扩大最小的项,到达叶子节点后插入节点,并按原路径返回依次修改其祖先节点的MBR。删除操作首先进行一次精确查询,如果找到该节点,则将其删除,并依次修改其祖先节点的MBR。
由以上介绍可以看出,R树的结构类似于B+树,因此它满足减少磁盘访问次数,和检索速度快的要求。但由于它将所有数据保存在叶子节点,中间节点只保存子节点的相关信息,所以R树的内存空间的浪费是很大。
AVL树是最先发明的自平衡二叉查找树。存AVL树中任何节点的两个子树的高度最大差别为一,所以它也被称为高度平衡树。查找、插入和删除在平均和最坏情况下都是O(log n)。增加和删除可能需要通过一次或多次树旋转来重新平衡这个树。
T树T树与AVL树一样,它的左子树与右子树之差不超过1,与AVL树不同的是在一个存储节点可以保存多个键值,它的最左与最右键值分别为这个节点的最小与最大键值,它的左子树仅仅包含那些键值小于它的记录,同理右子树只包括那些键值大于它的记录。图3是T树的结构示意图从T树的结构可以看出,T树具有同k-d树和R树相同的时间复杂度O(Log2N),但是它们最大的不同就是T树的每个节点包含多个键值,而且只有左右子节点的指针两个额外的附加信息,从而提高了节点的利用率。
T树的平衡处理与AVL树的平衡处理相同,都是通过左单旋(LL),左双旋(LR),右单旋(RL)和右双旋(RR)四种旋转操作来完成,唯一的不同在于T树的LR或RL旋转操作可能使得一个叶结点成为只含一个元素的内部结点,这时需要将它的一个子结点的元素移动到该结点,保证它仍旧是满足定义的T树。AVL树得名于它的节点的平衡因子是它的右子树的高度减去它的左子树的高度。带有平衡因子1、0或-1的节点被认为是平衡的。带有平衡因子-2或2的节点被认为是不平衡的,并需要重新平衡这个树。平衡因子可以直接存储在每个节点中,或从可能存储在节点中的子树高度计算出来。
在平衡的的二叉排序树BBST上插入一个新的数据元素e的递归算法可描述如下1.若BBST为空树,则插入一个数据元素为e的新结点作为BBST的根结点,树的深度增1;2.若e的关键字和BBST的根结点的关键字相等,则不进行;若e的关键字小于BBST的根结点的关键字,而且在BBST的左子树中不存在和e有相同关键字的结点,则将e插入在BBST的左子树上,并且当插入之后的左子树深度增加(+1)时,分别就下列不同情况处理之1.BBST的根结点的平衡因子为-1(右子树的深度大于左子树的深度,则将根结点的平衡因子更改为0,BBST的深度不变;2.BBST的根结点的平衡因子为0(左、右子树的深度相等)则将根结点的平衡因子更改为1,BBST的深度增1;3.BBST的根结点的平衡因子为1(左子树的深度大于右子树的深度)则若BBST的左子树根结点的平衡因子为1则需进行单向右旋平衡处理,并且在右旋处理之后,将根结点和其右子树根结点的平衡因子更改为0,树的深度不变;3.若e的关键字大于BBST的根结点的关键字,而且在BBST的右子树中不存在和e有相同关键字的结点,则将e插入在BBST的右子树上,并且当插入之后的右子树深度增加(+1)时,分别就不同情况处理之。
把T树作为MMDB高效的存储数据结构。T树是基于Adel′son Vel′skii and Landis.11的AVL树。与在AVL树中一样,T树的左子树和右子树高多数情况下可以相差1。
T树在内存空间的使用率上比k-d树和R树要高很多,但也存在着缺陷。因为T树在一维索引情况下无论是确切查询还是范围查询都有良好的搜索效果,但是在多维的情况下缺陷却非常明显,因为它只能以关键字中的某一个字段作为索引。例如某表的关键字由<key1,key2,key3>三个字段组成,假设以key1的值为索引建立T树,如果某个时刻内存中的记录集为C=f{<i,j,k>,0<i<10000;0<j<1000;0<k<100}的所有组合组成,即1000000000条记录,则查询的时候至少要比较1000*100条记录,由此可见查询的效率太低。
从上面分析知道,在这些建立多维索引的结构中,k-d树和R树相对于内存空间极为宝贵的内存数据库来说,它们都有浪费内存的缺点。而T树作为虽然具有存取速度快,节约空间的优点,但是对于多维索引的情况它的效率却不高。

发明内容
1.发明目的本发明目的是提出一种内存数据库中的网格+T树多维索引的方法。尤其是具有较高的效率和较低的存储,相对于内存数据库目前使用的典型的索引结构的多维索引的方法,提出网格+T树索引在内存数据库方面的应用;解决现有内存数据库方面的应用多维索引的方法存在的不足。
2.技术方案本发明的技术解决方案是内存数据库中的网格+T树多维索引的方法,在内存数据库中的网格+T树多维索引的方法,将整个记录集按照范围划分到不同的网格单元中,每个网格数据单元都通过网格目录(grid directory)与一个装载记录的数据桶相联系,每个数据单元只对应着一个数据桶;对于内存数据库将这些数据单元按某一字段建立一颗T树,从而使每一个数据桶按一字段建立一颗T树,将网格目录由一个k维(关键字的维数)数组来表示,这些数组单元所代表的字段范围称为刻度(scale),刻度是每颗T树的存储范围。
本发明所述内存数据库中的网格+T树多维索引的方法的改进是在网格+T树构成的内存数据库中数据单元可动态分配。所述动态分配;即这些数据单元内存数据库初始化预先划分好的一个内存空间,并根据需要在程序中动态地使用和释放。
对于磁盘数据库,一般一个数据桶对应硬盘上的一个磁盘页,占用的内存空间由建立网格所用的数组空间与建立T树所花费的空间组成。设有K维索引<I1,I2……Ik>,分别用刻度将其取值范围等分为P1,P2…Pk份。
3.发明特点本发明较好的解决了目前内存数据库索引不能有效利用内存空间和不适合多维的缺点,从而使内存数据库技术能在电信运营支撑系统中得到广泛的应用。尤其是利用T树在内存空间的使用率上比k-d树和R树要高很多,且T树在一维索引情况下无论是确切查询还是范围查询都有良好的搜索效果;但又是在网格分割中多个一维的结构,便于关键字中的某一个字段作为索引。


图1是本发明现有技术k-d树结构示意2是现有技术R树结构示意3是现有技术T树结构示意4是本发明网格+T树结构示意5是本发明网格+T树结构查询示意图具体实施方式
如图1、4所示。网格+T树多维索引的方法是从一种传统磁盘数据库的索引方法--网格文件(grid file)演化而来,它是一种典型的基于哈希的存取方法。
图4为网格+T树的结构示意图如图所示,将整个记录集按照(某种)范围划分到不同的网格单元中,每个网格单元都通过网格目录(grid directory)与一个装载记录的数据桶相联系,每个单元只对应着一个数据桶。对于磁盘数据库,一般一个数据桶对应硬盘上的一个磁盘页,对于内存数据库将这些数据单元按某一字段建立一颗T树,从而使每一个桶的大小变为可动态分配的。内存数据库将网格目录通常由一个k维(关键字的维数)数组来表示,这些数组单元所代表的字段范围称为刻度(scale)。
网格+T树的查询、插入和删除操作都类似,下面以查询为例说明其算法。查询操作网格+T树结构的查询非常简单。当进行精确查询时,首先用这些刻度来定位要查找记录所在的网格,然后通过网格目录找到要查询的T树,并按前面介绍的T树搜索方式进行搜索。
如下例userid--用户标识prcplnid--套餐标识;假设某个数据库的关键字由两个字段<userid,prcplnid>组成,其中字段userid的取值范围为1...50000,字段prcplnid的取值范围为1...12,网格的刻度划分为X(userid)=(1,10000,20000,30000,40000,50000);Y(prcplnid)=(1,3,6,9,12),则执行精确查找FIND(35000,7)的示意图如图5所示。
其中字段值35000在X轴上的刻度为X(4),字段值7在Y轴上的刻度为Y(3),则二维数组G(4,3)所指向的地址就是要查找记录所在的T树的根地址。对于范围查询,首先找到关键字的每个字段所在的刻度值,这些刻度值的交叉点所对应的网格单元即为所要查找的T树的集合。
网格分割原则(较高效率)网格分割的原则为尽量分割取值范围较少的键值,如果有可能将其划分为1,而将范围较大的作为建立T树的索引,这样可以降低关键字的维度,使在同一个区域内出现键值相同的情况降到最低,最终使搜索时比较的次数大大减少。最坏的情况是所有N个记录都被划分到一个网格中,那么内存中只有一颗T树建立,则时间复杂度为O(log2N);通常情况为所有记录均匀分布到各个网格中,则每个网格中记录数为N/(P1*P2*……*Pk),时间复杂度为O(log2(N/(P1*P2*……*Pk)))。
例如对上例中的C={<i,j,k>,0<i<10000;0<j<1000;0<k<100}的所有组合组成的记录集进行网格分割,仍以key1作为建立T树的索引,分别采用A=(1000,1,1);B=(10,10,10);C=(1,10,100)三种不同的分割方式将记录划分到1000个区域。则分割后对于某个给定的关键字的比较次数依次为100000,1000,100。网格+T树结构是在建立一颗庞大的T树与直接用多维数组进行索引之间所选择的一个折衷方案,在时间,空间的关系上找到一个平衡点,即节约了搜索时间,又节约了内存空间。
空间复杂性(较低的存储)占用的内存空间由建立网格所用的数组空间与建立T树所花费的空间组成。设有K维索引<I1,I2……Ik>,分别用刻度将其取值范围等分为P1,P2…Pk份,则建立网格所用的内存空间M1=C*P1*P2*……*Pk,其中C为一个地址所占用的字节数,如果为32位操作系统,则C=4;在T树的节点中采用保存记录地址来取代保存记录关键字的方法,通过多进行一次内存读操作来节约内存空间。由于T树节点中的数据项占用的空间远大于指向左右子节点的指针占用的空间,所以在这里只考虑数据项占用的空间,则M2=C*N,其中C同上,N为记录数。
所以总占用的内存空间为M=M1+M2=C*(P1*P2*……*Pk+N)。
下面以查询操作为例来说明实施效果userid(15位)--用户标识prcplnid(8位)--套餐标识;假设某个数据库的关键字由两个字段<userid,prcplnid>组成,其中字段userid的取值范围为1...50000,字段prcplnid的取值范围为1...12,现在内存数据库中共有100万条记录。执行走索引的查询操作测试结果如下索引类型内存大小(单位兆)效率(秒)K-D树 36M 5.12R树 40M 4.33T树 50M 3.32网格+T树26M 3.31从实际使用效果来看,网格+T树具有相对较低的存储开销同时具有很高的执行效率。
权利要求
1.内存数据库中的网格+T树多维索引的方法,其特征是将整个记录集按照范围划分到不同的网格单元中,每个网格数据单元都通过网格目录(grid directory)与一个装载记录的数据桶相联系,每个数据单元只对应着一个数据桶;对于内存数据库将这些数据单元按某一字段建立一颗T树,从而使每一个数据桶按一字段建立一颗T树,将网格目录由一个k维(关键字的维数)数组来表示,这些数组单元所代表的字段范围称为刻度(scale),刻度是每颗T树的存储范围。
2.由权利要求1所述的内存数据库中的网格+T树多维索引的方法,其特征是在网格+T树构成的内存数据库中数据单元可动态分配;即这些数据单元内存数据库初始化预先划分好的一个内存空间,并根据需要在程序中动态地使用和释放。
3.由权利要求1所述的内存数据库中的网格+T树多维索引的方法,其特征是对于磁盘数据库,一般一个数据桶对应硬盘上的一个磁盘页,占用的内存空间由建立网格所用的数组空间与建立T树所花费的空间组成。设有K维索引<I1,I2……Ik>,分别用刻度将其取值范围等分为P1,P2…Pk份。
4.由权利要求1所述的内存数据库中的网格+T树多维索引的方法,其特征是网格分割时分割取值范围是较少的键值,如果有可能其将其划分为1,而将范围较大的作为建立T树的索引。
全文摘要
内存数据库中的网格+T树多维索引的方法,将整个记录集按照范围划分到不同的网格单元中,每个网格数据单元都通过网格目录与一个装载记录的数据桶相联系,每个数据单元只对应着一个数据桶;对于内存数据库将这些数据单元按某一字段建立一颗T树,从而使每一个数据桶按一字段建立一颗T树,将网格目录由一个k维(关键字的维数)数组来表示,这些数组单元所代表的字段范围称为刻度(scale),刻度是每颗T树的存储范围。本发明较好地解决了目前内存数据库索引不能有效利用内存空间和不适合多维的缺点,利用T树在内存空间的使用率上比k-d树和R树要高很多,但又是在网格分割中多个一维的结构,便于关键字中的某一个字段作为索引。
文档编号G06F17/30GK1838124SQ200610038378
公开日2006年9月27日 申请日期2006年2月20日 优先权日2006年2月20日
发明者罗义斌, 袁胜, 朱兴宇, 刘泉, 顾恺宇 申请人:南京联创科技股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1