一种面向对象代理数据库的虚属性查询优化方法

文档序号:6402305阅读:192来源:国知局
专利名称:一种面向对象代理数据库的虚属性查询优化方法
技术领域
本发明涉及数据库查询处理领域,尤其是涉及一种面向对象代理数据库的虚属性查询优化方法。
背景技术
随着信息技术的发展,数据库技术也在不断地进步。以关系型数据库为代表的传统数据库因其完备的理论和有效的实现方法,取得了长足的发展和广泛有效的应用。新的领域如地理信息系统 、知识库系统和多媒体信息系统等,对数据库提出了新的需求,需要能够高效处理复杂数据类型。数据库技术与面向对象方法相结合是数据库技术研究和应用的重要方向,随之出现了面向对象模型,引入了对象和对象标识等重要概念。在面向对象数据库系统中,数据库是对象集合,而对象由数据和方法组成。面向对象数据库系统较好地支持非传统的数据类型,但是缺乏公共模型和形式化描述,在技术上成熟度不足,在现实中难以使用和推广。作为面向对象模型的扩充,对象代理模型来源于生活中代理人的概念。在对象代理模型中,对象信息的处理主要是构造一个代理对象作为其视图,代理对象可以继承源对象的部分或全部属性,称为虚属性,同时也可以扩展新的属性,称为实属性。共享同样属性和方法的所有对象构成一个对象类,所有代理对象构成代理类。在实际存储中,只存储实属性的值,虚属性只存储模式信息,不实际存储其值,而是通过指针获取对应实属性的值。依据对象代理模型实现的对象代理数据库,因其特殊的存储机制,采用切换表达式的方式,存储虚属性与实属性的关联,通过对这种表达式求值来实时获取虚属性的值。在对象代理数据库查询执行阶段,虚属性的获取极大影响了查询的效率,优化虚属性的查询效率对于对象代理数据库的推广使用有着重大的意义。

发明内容
本发明的上述技术问题主要是通过下述技术方案得以解决的:
一种面向对象代理数据库的虚属性查询优化方法,其特征在于,基于以下定义:在对象代理数据库中,代理类类似于特殊的视图,但又不等同关系型数据库的视图;代理类能够继承源类的属性和方法,同时又可扩展相应的属性;在处理代理类上的查询时,能够借鉴关系型数据库处理视图的方法,即将代理类上的查询表达式提升到源类上,这个过程称之为表达式提升;在创建代理类时,需要将代理规则部分抽取出来,代理规则与创建视图的形式相同,采用系统创建视图的方式,将代理类以视图的形式注册到系统中;所述表达式提升包括以下步骤:
步骤I,建立代理类列表D印UtyLiSt,扫描查询涉及到的范围表列表,判断当前类是否是代理类,如果当前类是代理类,而且在查询中不涉及到该类的实属性,则加入到D印UtyList中;若当前类不是代理类,则无需进行表达式提升,结束整个步骤;
步骤2,对于步骤I中生成的D印UtyList中的每个代理类,设其查询需要的代价为costl,同时设代理类提升后对应的源类上的查询代价为cost2,若costl > cost2,则标记该代理类为能够提升;若costl <= cost2,则提升表达式后的代价不小于未提升的代价,标记该代理类为不能提升;
步骤3,对于D印UtyList中标记为能够提升的代理类,采用查询重写的方式,对该代理类出现的地方进行重写,用源类和代理规则来重写查询,从而实现表达式提升;
步骤4,将查询表达式提升至源类后,若该源类是代理类,转至步骤2。若该源类不是代理类,则结束整个过程。在上述的一种面向对象代理数据库的虚属性查询优化方法,所述的步骤2中,在步骤2中,代价计算过程如下:
对象代理模型通过对象代理代数定义代理类;对象代理代数主要由SELECT、PROJECT、EXTEND、UNION、J0IN、GR0UP六种基本操作构成,根据这六种基本操作的组合,在对象代理数据库中定义了四种基本的代理类类型,分别为SELECT、UNION、JOIN、GROUP四种,由于在对象代理数据库中,索引扫描有着特殊性,为了同传统数据库相结合,特介绍顺序扫描下的代价;
步骤2.1,代理类在存储时,采用了存储实属性值,虚属性仅存储源对象和代理对象双向指针的策略。在扫描代理类时,不能直接获取虚属性的值。获取虚属性值的代价分为扫描代理类、查找源对象和代理对象双向指针表(pg_bipointer)以及根据源对象对象标识获取源对象三部分,其表达如公式一所示:
PCost = N(D) + MAPCost + PF(S)公式一
其中,定义N(D)为代理类D所占磁盘数,MAPCost为扫描pg_bipointer表的代价,PF(S)为获取源对象的代价。步骤2.2,在SEL ECT代理类中,将代理类上的查询提升到源类后,扫描涉及到的代价主要为扫描源表的代价,其表达如公式二所示:
FCostl = N(S)公式二
其中,定义N(S)为源类S所占磁盘数。步骤2.3,在UNION代理类中,将代理类上的查询提升到源类后,扫描时必须要实现两个子查询的UNION操作,因此提升后的代价主要为两个子查询和UNION操作的代价,其表达如公式三所示:
FCost2 = N(Sl) + N(S2) + P(Sl) + P(S2)公式三
其中,定义N(Sl)=源类SI所占磁盘数,N(S2)为源类S2所占磁盘数,P(Sl)为源类SI元组数,P(S2)为源类S2元组数。步骤2.4,在JOIN代理类中,将代理类上的查询提升到源类后,扫描时必须要实现类的JOIN操作,而JOIN操作在数据库中是非常耗时的操作,当出现这种代理类时,一般不进行提升操作。其进行表达式提升后的代价公式如公式四所示:
FCost3 = N(Sl) + N(S2) + P(Sl) * P(S2)公式四
其中,定义N(Sl)=源类SI所占磁盘数,N(S2)为源类S2所占磁盘数,P(Sl)为源类SI元组数,P(S2)为源类S2元组数。
步骤2.5,在GROUP代理类中,将代理类上的查询提升到源类后,查询时需要进行聚集操作,但无论是否进行提升,查询时都需要进行聚集操作。因此在提升表达式后进行代价计算时,主要考虑对源类的扫描和源类按某属性分组的代价,其代价公式如公式五所示:
FCost4 = N(S) + V(Sl)公式五
其中,定义N(S)为源类S所占磁盘数,V(Sl)为源类S按某个属性分组的代价。步骤2.6,将PCost与FCost进行比较,如果PCost比较大,则进行提升表达式操作。因此,本发明具有如下优点:1.对于代理类的查询有很大的提升作用,具体说明如下:针对不同代理类的特点和情况,·采用代价估计的方式,对表达式提升前后分别进行代价计算,选择满足条件的代理类进行提升,从而保证表达式提升对查询的效率有提升作用;2.对于系统实现有很大的指导作用,具体说明如下:针对代理类的特点,定义代理规则时,采用传统数据库中视图的处理方式,在提升过程中,对代理类进行查询重写,为代理类的查询提供了一条更加高效的方式;3.时间复杂度低,对对象代理数据库的查询效率有着较大的提高,对于对象代理数据库的推广有着极大的意义。


图1为代理类定义形式。图2为SELECT代理类的代理规则形式。图3是本发明的方法流程示意图。
具体实施例方式下面通过实施例,并结合附图,对本发明的技术方案作进一步具体的说明。实施例:
本发明提供的是基于提升表达式的方式来提高虚属性的查询效率,具体是采用包括以下步骤的方法:
在对象代理数据库中,代理类类似于特殊的视图,但又不等同关系型数据库的视图。代理类可以继承类的属性和方法,同时又可扩展相应的属性。在处理代理类上的查询时,可以借鉴关系型数据库处理视图的方法,即将代理类上的查询表达式提升到源类上,这个过程称之为表达式提升。在创建代理类时,代理类定义形式如图1所示,需要将代理规则部分抽取出来,以SELECT代理类为例,如图2所示,代理规则与创建视图的形式相同,采用系统创建视图的方式,将代理类以视图的形式注册到系统中。提升表达式的步骤包括以下子步骤:
步骤I,建立代理类列表D印u t y L i s t,扫描查询涉及到的范围表列表,判断当前类是否是代理类,如果当前类是代理类,而且在查询中不涉及到该类的实属性,则加入到DeputyList中。若当前类不是代理类,则无需进行表达式提升。步骤2,对于D印UtyLiSt中的每个代理类,查询需要的代价costl,将代理类直接转化对源类上查询,查询需要的代价cost2,若costl > Cost2,则标记该代理类为可提升。若costl <= cost2,则提升表达式后的代价不小于未提升的代价,标记该代理类为不能提升。步骤3,对于D印UtyList中标记为可提升的代理类,采用查询重写的方式,对该代理类出现的地方进行重写,用源类和代理规则来重写查询,从而实现表达式提升。步骤4,将查询表达式提升至源类后,若该源类是代理类,转至步骤2。若该源类不是代理类,则结束整个过程。对步骤2中代价估计部分以一个具体的实例进行详细说明:
SELECT代理类是只允许从一个类中选择源对象进行代理。源对象和代理对象是一一对应的。以一具体实例对提升算法进行说明。CREATE CLASS basicA ( a int , b int, c int) ; a 上有索引
CREATE SELECTDEPUTYCLASS deputyB(d int) as (select a+2 as newa, b frombasicA where a >3 and b >4);
查询语句:SELECT newa, b FROM deputyB WHERE newa〈10;
在查询编译阶段,目标表中包含代理类cbputyB。现在进行代价估算,判断是否需要进行表达式提升。直接对CbputyB进行扫描的代价:扫描路径分为顺序扫描和带索引扫描,代价分别为costl, cost2,选择代价较小的扫描路径cost3= min (costl, cost2)。由于选择条件中包含虚属性,因此会进行切换表达式计算,代价包含对系统表的查询和取实属性的I/O操作,记为cost4。其中,表达式运算符的CPU代价较小可以忽略不计。当目标属性列包含虚属性时,同选择条件中包含虚属性的处理过程类似,代价为cost5。总代价sumcostl=cost3+cost4+cost5.转化为basicA进行扫描的代价:a上有索引,可能会选择带索引的扫描,也可能选择顺序扫描的路径,代价分别为cost6和cost7,扫描代价为cost8=min (cost6, cost7)。在条件判断和投影运算时,由于元组的值均为实属性,是实际存在的,只涉及到CPU代价。总代价 sumcost2 = cost8。对步骤3中查询重写部分以一个具体的实例进行详细说明:
当sumcostl〈 sumcost2,将表达式提升到源类上,借鉴PostgreSQL数据库对视图查询重写的过程,转化为:
被分析器解释之后的原始查询树,逻辑上的表示方式:
SELECT deputyB.newa, deputyB.b FROM deputyB WHERE deputyB.newa<10;
表达式提升后的查询树,逻辑上的表示方式:
SELECT deputyB.newa, deputyB.b FROM (SELECT a+2 as newa, b FROM basicAwhere a>3 and b>4) deputyB WHERE deputyB.newa < 10;
对deputyB上的查询转化为对basicA的查询。其余三种代理类情况和SELECT代理类情况类似,可以参考SELECT的处理方式。本文中所描述的具体实施例仅仅是对本发明精神作举例说明。本发明所属技术领域的技术人员可以对所描述的具体实施例做各种各样的修改或补充或采用类似的方式替代,但并不会偏离本发明的精神或者超越所附权利要求书所定义的范围。
权利要求
1.一种面向对象代理数据库的虚属性查询优化方法,其特征在于,基于以下定义:在对象代理数据库中,代理类类似于特殊的视图,但又不等同关系型数据库的视图;代理类能够继承源类的属性和方法,同时又可扩展相应的属性;在处理代理类上的查询时,能够借鉴关系型数据库处理视图的方法,即将代理类上的查询表达式提升到源类上,这个过程称之为表达式提升;在创建代理类时,需要将代理规则部分抽取出来,代理规则与创建视图的形式相同,采用系统创建视图的方式,将代理类以视图的形式注册到系统中;所述表达式提升包括以下步骤: 步骤I,建立代理类列表D印u t y L i S t,扫描查询涉及到的范围表列表,判断当前类是否是代理类,如果当前类是代理类,而且在查询中不涉及到该类的实属性,则加入到D印UtyList中;若当前类不是代理类,则无需进行表达式提升,结束整个步骤; 步骤2,对于步骤I中生成的D印UtyList中的每个代理类,设其查询需要的代价为costl,同时设代理类提升后对应的源类上的查询代价为cost2,若costl > cost2,则标记该代理类为能够提升;若costl <= cost2,则提升表达式后的代价不小于未提升的代价,标记该代理类为不能提升; 步骤3,对于D印UtyList中标记为能够提升的代理类,采用查询重写的方式,对该代理类出现的地方进行重写,用源类和代理规则来重写查询,从而实现表达式提升; 步骤 4,将查询表达式提升至源类后,若该源类是代理类,转至步骤2,若该源类不是代理类,则结束整个过程。
2.根据权利要求1所述的,其特征在于,所述的步骤2中,在步骤2中,代价计算过程如下: 对象代理模型通过对象代理代数定义代理类;对象代理代数主要由SELECT、PROJECT、EXTEND、UNION、J0IN、GR0UP六种基本操作构成,根据这六种基本操作的组合,在对象代理数据库中定义了四种基本的代理类类型,分别为SELECT、UNION、JOIN、GROUP四种,由于在对象代理数据库中,索引扫描有着特殊性,为了同传统数据库相结合,特介绍顺序扫描下的代价; 步骤2.1,代理类在存储时,采用了存储实属性值,虚属性仅存储源对象和代理对象双向指针的策略,在扫描代理类时,不能直接获取虚属性的值,获取虚属性值的代价分为扫描代理类、查找源对象和代理对象双向指针表(pg_bipointer)以及根据源对象对象标识获取源对象三部分,其表达如公式一所示: PCost = N(D) + MAPCost + PF(S)公式一 其中,定义N(D)为代理类D所占磁盘数,MAPCost为扫描pg_bipointer表的代价,PF(S)为获取源对象的代价; 步骤2.2,在SELECT代理类中,将代理类上的查询提升到源类后,扫描涉及到的代价主要为扫描源表的代价,其表达如公式二所示: FCostl = N(S)公式二 其中,定义N(S)为源类S所占磁盘数; 步骤2.3,在UNION代理类中,将代理类上的查询提升到源类后,扫描时必须要实现两个子查询的UNION操作,因此提升后的代价主要为两个子查询和UNION操作的代价,其表达如公式三所示:FCost2 = N(Sl) + N(S2) + P(Sl) + P(S2)公式三 其中,定义N(Sl)=源类SI所占磁盘数,N(S2)为源类S2所占磁盘数,P(Sl)为源类SI元组数,P(S2)为源类S2元组数; 步骤2.4,在JOIN代理类中,将代理类上的查询提升到源类后,扫描时必须要实现类的JOIN操作,而JOIN操作在数据库中是非常耗时的操作,当出现这种代理类时,一般不进行提升操作,其进行表达式提升后的代价公式如公式四所示: FCost3 = N(Sl) + N(S2) + P(Sl) * P(S2)公式四 其中,定义N(Sl)=源类SI所占磁盘数,N(S2)为源类S2所占磁盘数,P(Sl)为源类SI元组数,P(S2)为源类S2元组数; 步骤2.5,在GROUP代理类中,将代理类上的查询提升到源类后,查询时需要进行聚集操作,但无论是否进行提升,查询时都需要进行聚集操作,因此在提升表达式后进行代价计算时,主要考虑对源类的扫描和源类按某属性分组的代价,其代价公式如公式五所示:FCost4 = N(S) + V(Sl)公式五 其中,定义N(S)为源类S所占磁盘数,V(Sl)为源类S按某个属性分组的代价; 步骤2.6,将PCost与FCost进行比较,如果PCost比较大,则进行提升表达式操作。
全文摘要
本发明公开了一种面向对象代理数据库的虚属性查询优化方法,在方法中提出了基于表达式提升的优化方案。在基于表达式提升的优化方案中,根据代理类独特的特性,对不同代理类对应的源类上查询进行了代价估计,提出了代价估计函数。通过代价估计函数可以很好地对源类和代理类扫描的代价进行衡量,从而判断是否能够进行表达式提升。当满足条件后,采用类似于视图的处理方式,将对代理类的查询提升为对源类的查询,从而减少切换表达式的计算次数,达到优化的目的。通过对虚属性的查询进行优化,可以极大地提高对象代理数据库的实用性。
文档编号G06F17/30GK103218439SQ20131013978
公开日2013年7月24日 申请日期2013年4月22日 优先权日2013年4月22日
发明者彭智勇, 王梁, 付祖发, 彭煜玮 申请人:武汉大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1