自动生成数据库查询的方法和系统的制作方法

文档序号:3418347阅读:619来源:国知局

专利名称::自动生成数据库查询的方法和系统的制作方法
技术领域
:本发明涉及数据库软件系统的测试技术。更具体地说,本发明涉及自动生成数据库查询的方法和系统,通过考虑列组数据相关性(ColumnGroupDataCorrelation)和行集数约束(CardinalityConstraint),能够基于谓词^数实例化(instantiation)自动生成用于数据库的查询。
背景技术
:自动地生成用于测试数据库引擎的新功能(比如优化器算法)的查询以及用于评估数据库应用(例如电子商务应用)的性能的查询在实践中是一项非常令人气馁的工作。在许多测试情形中,需要非常仔细地的设计测试查询,这往往使得测试工作十分辛苦并耗费大量时间。对在数据库引擎中新设计和/或新开发的功能,比如新优化器算法进行性能和质量的测试,B相对改进的常用方法是生成一组测试数据和查询,然后比较施加新功能之前和之后数据库系统的行为。显然,对于给定的测试数据库,合理的测试方案应当涵盖具有宽范围的模式和特征各种查询。另外,针对特定测试目的/方案,非常希望能够控制测试查询的输入(例如,参数值,谓词过滤,以及选择条件等等)和输出(例如,中间查询结果和行集数等等)。但是,对于业界和学术领域的当前装备来说,获取如上所述期望的测试查询几乎是不可能的,这是因为所生成的查询是独立于测试数据库的。结果,在大多数情形下不得不忍受"尝试-失败"所带来的不利后果。对于评估数据库应用的性能和测试数据库应用的鲁棒性而言,由于诸多众所周知的优点,比如效率、灵活性和安全性,因此当今的应用大多使用具有^^lt才示i己(parametermarker)或主变量(hostvariable)的动态查询。此类动态SQL的4吏用对基于成本的数据库优化器提出了巨大挑战,并且作为结果可能导致查询潜在的性能退化,这是因为经常确定无效的访问路径。由于在使用^t标记模糊化搜索条件的情况下,优化器的估计仅仅简单地基于默认值和改写(interpolation)、猜测工作的种类,结果是不能区分有效和无效访问路径。因此,测试具有潜在输入变化的查询性能非常重要。,然而,对于所有的参数标记测试有意义的输入值非常困难,这是因为在应用运行期间所有的^都是动态设置的。即使在运行应用时进行测试,不仅显著增加测试工作的复杂性和繁瑣程度,而且也难以保证探究所有的主要可能情况(比如,最;^/最小值、数据偏斜、以及数据相关性等等)。因此,对于与数据库管理系统(DBMS,databasemanagementsystem)相关的测试,非常需要能够以自动并且可控的方式来生成期望的测试查询。当前业界和学术领域已经针对自动生成查询进行了一些研究并提出了相应的自动生成查询的方法。但是,在这些自动查询生成解决方案中,大多数都不针对测试的目的。比如,在美国专利US6,285,998中提出了一种允许用户针对数据库查询快速指定期望值并保存查询以便再使用的查询方法。虽然能够方便地生成并且容易地再使用查询,但是该方法并不能解决测试数据库性能的问题。另外,在测试查询生成领域,v^有关于测试数据库和测试查询之间的关系方面来看,存在两种主要的方案。第一种方案不考虑lt据而生成查询,此类解决方案不能处理上面所讨论的两种情形,即,对在lt据库引擎中新设计和/或新开发的功能进行性能和质量的测试、以及评估数据库应用的性能和测试数据库应用的鲁棒性,这是因为此类解决方案均i殳计为生成通用目的的查询。例如,在J.Tuya,M.J.SMrez-Cabal和C.laRiva发表的"Mutatingdatabasequeries",/<9Mffl/7fi/o簡flftVw"wd5V/^nwerecA/io/ow,2007,Elsevier中将突变测试概念引入DBMS测试中,通iM"查询生成一组突变因子来确保SQL测试的涵盖范围。但是,通过该方法生成的大多数查询都与底层的测试数据不相关。作为另一个例子,在美国专利US6,138,U2、US6,581,052、US6,826,558和US7,007,007中提出了一种在短时间内随机地生成大量有效SQL语句的方法。但是,该生成是以随机的方式进行的,因此很难控制测试用例的输入和输出。第二种方案则通过考虑测试数据来生成查询,但是目前提出的解决方案在实际应用中都存在诸多限制。例如,在N.Bruno,S.Chaudhuri和D.Thomas发表的"GeneratingQuerieswithCardinalityConstraintsforDBMSTesting",/EEE7hiwsfl"/柳sJDiow/^l^朋</五"g/"em."g,2006中提出了一种生成具有行集数约束的查询的方法。但是,该工作却基于查询中的各个谓词彼此相互独立的假设,这在实际应用中是非常罕见的,因而也m^取得理想的结果。
发明内容鉴于上述情况,本发明针对与DBMS相关的测试提供一种自动生成数据库查询的方法和系统,其自动生成数据库查询的策略基于具有特定行集数约束的给定查询中的每一个局部谓词的M实例化。根据本发明的一个方面,提供一种生成数据库查询的方法,包括步骤接收输入查询和行集数约束;以及根据数据库的列组数据相关性对输入查询的局部谓词^lt进行实例化,以生成满足行集数约束的候选测试查询。优选地,生成测试查询的步骤包括步骤为输入查询构建有向查询图;对有向查询图进布逸历以构建有向生成树;对有向生成树进行遍历以生成中间结果表;以及根据中间结果表生成满足行集数约束的候选测试查询。根据本发明的另一个方面,提供一种生成数据库查询的系统,包括有向查询图构建器,用于为输入查询构建有向查询图;有向生成树构建器,用于对有向查询图进行遍历以构建有向生成树;矩阵生成器,用于对有向生成树进行遍历以生成中间结果表;以及候选查询生成器,用于才艮据中间结a生成满足行集数约束的候选测试查询。优选地,按照参照完整性关系为输入查询构建具有根顶点的有向查询图;通过深度优先遍历对有向查询图进行遍历以构建有向生成树;以及通过广度优先搜索对有向生成树进行遍历以生成中间结^。根据本发明的一个优选实施例,生成中间结果表的步骤按照层次顺序对有向生成树进行遍历,并且包括步骤针对每一层的有向生成树遍历,级联输入查询中局部谓词的参照列作为中间结果表的列组;通过对列组值进行分组从数据库中检索聚合数据信息;以及在中间结果表中保留各列组值均满足行集数约束的列组值并在中间结果表中记录行集数。根据本发明的另一个优选实施例,行集数约束c为在可接受范围内的行集数约束C',并且所述方法还包括根据"相对偏差-max(f^)"对所生成的候选测试查询进行评价的步骤,以从中选择一组期望的测试查询。此夕卜,才艮据本发明的一个实施例,局部谓词包括等于谓词、单侧谓词、以及双侧谓词。根据本发明的再一个优选实施例,在为输入查询构建的有向查询图为多于一个根顶点的情况下,所述方法还包括步骤在构建有向查询图之后,标识有向查询图中的接合点和桥接弧;在构建有向生成树之后,通过虚拟弧链接不同有向生成树中的相关顶点,以将构建有向生成树步骤所构建的多个有向生成树转换成有向生成森林;以及在中间结果表生成步骤中分别针对每一个有向生成树生成中间结果,然后将每一个中间结果表看作临时表,将虚拟弧作为有向生成树之间的联接关系,以进一步生成最终的中间结果表。根据本发明的另一个优选实施例,查询包括子查询,并且如果子查询为相关子查询,将其去相关为不相关子查询;所述方法在生成候选测试查询之前还包括步骤从最深层的子查询开始直到最外层子查询,逐层迭代生成中间结M。此外,根据本发明的一个实施例,行集数约束为多个行集数约束,分别用于有向生成树的各层。根据本发明的另一个优选实施例,在有向生成树为左深树的情况下,根据查询访问计划的的^i接顺序来逐层生成中间结果表。才艮据本发明的自动生成数据库查询的方法和系统,通过考虑目标测试数据库中的数据使得所生成的查询能够满足特定行集数约束,这使得用户能够将行集数约束指定为输入,并由此能够生成期望的测试查询作为用于特定目的测试的输出。根据本发明的自动生成数据库查询的方法和系统,利用通过(类似)外键联接的表的数据依赖来构建有向查询图,并且进而生成有向生成森林或者有向生成树。通iti4历有向生成森林或者有向生成树,根据本发明的自动生成数据库的方法和系统能够从目标测试数据库中检索链接的列组的聚合数据信息,从而使得所生成的数据库查询与目标测试数据库的相关性得到加强。根据本发明的自动生成数据库查询的方法和系统,在检索聚合数据信息时能够正视列组的数据相关性。也就是说,将(一个表或者一组表)的局部谓词的参照列链接为列组,并且通过按照列组值进行分组iM^目标测试数据库中查找数据和检索聚合数据信息。这样,就避免了假设在实际应用中非常罕见的查询的各个谓词彼此相互独立的情况。根据本发明的自动生成数据库查询的方法和系统,才艮据所检索到的聚合数据信息通过对输入查询的局部谓词的参数值进行实例化来自动生成最后的候选查询,由此使得所得到的候选查询与目标测试数据库的相关性得到加强。因此,根据本发明的自动生成数据库查询的方法和系统,不仅能够自动生成满足特定行集数约束的查询,而且还通过设置从目标测试数据库中聚合的有意义的数据(值)来替代查询中每一个局部谓词的参数值,使得所得到的查询与目标测试数据库的相关性得到加强。另外,本发明还提供用于实现上述自动生成数据库查询的方法的计算^4呈序。此外,本发明也提供至少计算机可读介质形式的计算机程序产品,其上记录有用于实现上述自动生成数据库查询的方法的计算积4呈序代码。参照下面结合附图对本发明实施例的说明,会更加容易地理解本发明的以上和其它目的、特点和优点。在附图中,相同的或对应的技术特征或部件将采用相同或对应的附图标记来表示。附图中图1示出根据本发明的自动生成数据库查询的方法和系统的原理示意图2(a)示出初始查询g的SQL表示;图2(b)示出考虑传递闭包的查询0+的SQL表示;图2(c)示出新生成的查询g'的SQL表示;图3示出根据本发明的自动生成数据库查询的方法的总体流程图4(a)示出才艮据本发明的一个实施例的有向查询图Ge;图4(b)示出对图4(a)所示的有向查询图G。进行遍历后生成的有向生成树re;图4(c)示出图4(b)所示的有向生成树re的等价分层树结构re;图5(a)示出具有多个根顶点的有向查询图5(b)示出对图5(a)所示的有向查询图进行遍历后生成的有向生成森林;10图5(c)示出对图5(b)的有向生成森林进行变换后得到的变换后的有向生成森林;图6示出用虚拟顶点构成的有向生成树;图7示出具有三层子查询的有向生成森林的结构;图8示出通过左深树进行的查询访问计划;以及图9示出根据本发明的自动生成数据库查询的系统的总体方框图。具体实施例方式下面参照附图来说明本发明的实施例。应当注意,为了清楚的目的,附图和说明中省略了与本发明无关的、本领域普通技术人员已知的部件和处理的表示和描述。现在参考附图,特别是图l,首先描述本发明所要解决的具体技术问题。在此可以简单地将本发明要解决的问题归纳为生成具有特定行集数约束的查询。如图l所示,根据本发明的自动生成数据库查询的方法和系统,将给定的测试数据库D、查询0、以及用户规定的行集数约束C作为输入,通过找到使得查询满足约束C的参数值由自动查询生成模块按照谓词M实例化原则生成一组候选查询^作为输出。所新生成的该组候选查询可以表示为W|每一个0'均满足约束C]。对于一个查询0,其简单的SQL语句表述如图2(a)所示(在此为了筒洁省略了GROUPBY、ORDERBY等子句),示出初始查询的SQL表示,其中s^4或者聚合列的集合,Ti,..,r"是查询g的参照表的列表,r/丄(is"")是表77的局部谓词集合并且可以表示为析取范式77丄C,产/^A…A77丄C汰-;7汰,每一个丄CV^部谓词T7丄C『/^的参照列并且/^是相关^lt(i^"w,1^/、a),/是联接谓词集合。这里使用r/丄c表示表7的局部谓词中的所有参照列的集合,使用Ti/(:表示表ri'的联接谓词中的所有参照列的集合,并且使用7L/表示所有表r/的联接谓词的集合。因此,^^riju…ur"j。在某些情况下,查询中谓词的参数/^可能不是具体的值,而是^lt标记或者主变量,例如局部谓词27丄C『/^可以是T7丄q^或者T7丄C『:hvl。为了保留联接关系并JLit免在处理过程中遗漏可能的联接,需要通过增加逻辑上隐含的联接来针对初始查询0找到其传递闭包查询^+。图2(b)是考虑联接的传递所得到的传递闭包查询g+的的SQL语句表示,其中联接谓词集合/+是联接谓词集合/的传递闭包。现在可以将本发明的查询生成策略具体描述为,对于图2(a)和图2(b)分别表示的给定查询0和其传递闭包0+,自动生成一组满足约束C的测试查询,新生成的每一个查询g'的格式类似于图2(c)所示的格式。更具体地说,通过修改每一个表的局部谓词的M值来生成查询。因此,对于查询0的每一个表7Y及其初始局部谓词T7丄,新查询^冲的新的局部谓词集合T7丄'被^lt化为7LLC,尸/7,/a...aT7丄G;T/,汰',其中每一个>1*值/V(1^/、"由下面将详细描述的本发明的自动生成数据库查询的方法和系统来赋值。在此将该处理过程称为谓词^lt实例化。在针对每一个局部谓词进行参数实例化的过程中,与上面提到的N.Bruno,S.Chaudhuri和D.Thomas在"GeneratingQuerieswithCardinalityConstraintsforDBMSTesting",71rflwsfldVws柳A/iow/^^"iM/2)"to五"g/"MW"g,2006中假设实际应用中非常罕见的查询中的各个谓词彼此相互独立不同,在本发明的查询生成过程中考虑列的相关性。为了便于更加清楚地理解本发明的实质和原理,在下面的描述中将会结合一个具体应用实例来进行i兌明。该实例为IBMWebSphereCommerce环境下的一个四路联接查询0,如下所示SELECTATTRVALUE.SEQUENCE,ATTRIBUTE.USAGE,ATTRIBUTE.DESCRIPTION,ATTRTYPE.OID,CATENTRY.PARTNUMBER,CATENTRY.URL,CATENTRY.CATENTRY—ID,CATENTRY.ONAUCTIOS",CATENTRY.LASTUPDATE,CATENTRY.MARKFORDELETE,CATENTRY.STARTDATE,CATENTRY.ENDDATEFROMATTRVALUE,ATTRIBUTE,ATTRTYPE,CATENTRYWHEREATTRVALUE.STRINGVALUE=ANDATTRVALUE.NAME=ANDATTRIBUTE.GTYUNIT—ID=ANDATTRTYPE.DESCRIPTION=ANDCATENTRY.F工ELD4=ANDATTRVALUE.ATTRIBUTE—工D=ATTRIBUTE.AT"FRIBUTE—IDANDATTRVALUE.ATTRTYPE—ID=—ATTRTYPE.ATfRTYPE一IDANDATTRVALUE.CATENTRY一ID=一CATENTRY.CATENTRY—IDANDATTRIBUTE.CATENTRY—ID=—CATENTRY.CATENTRY—ID;为了使问题更加清楚简洁并突出本发明的^[心原理,利用下表1所示的符号解释映射将上述查询g进行符号化表示。表1符号解释映射表符号查询元素TlATTRVALUET2ATTRIBUTET3ATTRTYPET4CATENTRYTl.ClATTRVALUE.STRINGVALUET1.C8ATTRVALUE.NAMET2.C5ATTRIBUTE.GTYUNITIDT3.C6ATTRIBUTE.GTYUNITIDT4.C7CATENTRY.FIELD4T1.C2ATTRVALUE.ATTRIBUTEIDT1.C3ATTRVALUE.ATTRTYPEIDTl.C4ATTRVALUE.CATENTRY工DT2.C2ATTRIBUTE.ATTRIBUTEIDT2.C4ATTRIBUTE.CATENTRY工DT3.C3ATTRTYPE.ATTRTYPEIDT4.C4CATENTRY.CATENTRYIDSATTRVALUE.SE叫ENCE,ATTRIBUTE.USAGE,ATTRIBUTE.DESCRIPTION,ATTRTYPE.〇ID,CATENTRY.PARTNUMBER,CATENTRY.URL,CATENTRY.CATENTRYID,CATENTRY.ONAUCT工O百,CATENTRY.LASTUPDATE,CATENTRY.MARKFORDELETE,CATENTRY.STARTDATE,CATENTRY.ENDDATE按照上表1的符号解释,对上述查询G进行符号化后的SQL语句表示如下f斤示SELECTSFROMTl,T2,T3,T4WHERETl.Cl=ANDT1.C8=ANDT2.C5=AND13T3.C6=ANDT4.C7=ANDT1.C2=T2.C2ANDT1.C3=T3.C3ANDT1.C4=T4.C4ANDT2.C4=T4.C4相应地,其传递闭包查询g+的SQL语句表示如下所示SELECTSFROMTl,T2,T3,T4WHERET1.C1=ANDT1.C8=ANDT2.C5=ANDT3.C6=ANDT4.C7=ANDT1.C2=T2.C2ANDT1.C4=T2.C4AND十<—传递T1.C3=T3.C3ANDT1.C4=T4.C4ANDT2.C4=T4.C4这里,用符号十表示通过传递闭包增加的联接谓词。至此,经过上述筒化处理之后,问题变为针对查询0如何生成一组满足用户规定的行集数约束c的新查询g',即将上述查询中谓词参数"?"进行实例化处理后生成候选查询0'。下面将结合附图并针对上述实例详细说明本发明的自动生成数据库查询的方法和系统。参考图3,示出才艮据4^发明的自动生成数据库查询的方法的总体流程图。如图3所示,首先在步骤S31中,通过考虑(类似)参照完整性关系为给定查询0生成有向查询图Ge。对于查询g,假定<72=<^,j一是其顶点标注的有向图,其中Kg是顶点集合,每一个顶点代表查询0所参照的一个表"e是弧集合^r",7V>ir",rveKeAr"#rv},每一个弧代表基于参照完整性的顶点r"和?v之间的联接关系。第一个坐标r"表示子表或者细目表,而第二个坐标rv表示父表或者主表。在此假定在父和子属性之间总是存在联接关系以反映参照完整性关系。弧的方向则暗示了子属性和父属性之间的依赖关系。也就是说,父属性决定了其子属性,并且由此子属性的每一个值总是能够唯一地在父表中找到。在某些情况下,各个表通过类似外键联接,例如一对一联接。作为另一个例子,表的属性的值为另一个表的联接属性的值的子集或超集(superset)。所有这些联接都可以在通过本发明的有向查询图来表示。通常,有向图Ge中的顶点r"通过(A:+i+w)元组(/q,…,/Q,yc。,yd,…,y^)来标注,其中元素yc。表示r"的联接父属性(列),每一个元素(12/^附)表示联接子属性(列)中的一个,以及每一个元素/c,(ls/d)表示r"的局部谓词的一个中的列。在此,通过将父属性加星号(*)以及将局部谓词的列加下划线CJ而将上述(A:+l+w)元组(/d,…,/Q,大。,yd,表示为(Za,.."hJc。、yd,...,_/、),以便在查询图中清楚地区分这三种表中的列。图4(a)示出了按照上述规则对上面给出的实例所构造的有向查询图。如图4(a)中所示,T1.C1和T1.C8、T2.C5、T3.C6、T4.C7分别是表T1、T2、T3、T4的局部谓词的列,因此在其下边加上下划线。T2.C2、T3.C3、T4.C4则是联接父属性(列),因此加上星号(*)以示区别。余下的T1.C2、T1.C3、T1.C4、T2.C4则是联接子属性(列)。应该指出的是,在有向查询图Ge中,如果一个顶点7>的入度/《7>)为O,则将该顶点2>称为图Ge的才艮顶点。对于才艮顶点2>,其标注的元组总是fe,…,Ze^M,…,六J,表明表7>没有被参照的父属性,因此不会有大o。在上面所示的实例中,Tl^l才艮顶点。另外,对于一个顶点r/,如果其出度orf(r/)为o,则其标注的元组总是fe,...,^,^。*),这表明表r/没有子属性,因此缺少/'d,…,和_/、。在上面所示的实例中,T3和T4是这一类型的顶点。在步骤S31中构建了有向查询图G^之后,处理流程前进到步骤S32,在此通过遍历查询图Ge构建有向生成树re。在该步骤S32中,根据本发明的一个实施例,通过深度优先遍历(DFS,DepthFirstSearch)来遍历在步骤S31中生成的有向查询图Ge,以便生成有根的有向生成树re。根据本发明的一个实施例,用于遍历有向查询图(^的深度优先遍历的算法如下所示深血义遂>^#法餘入l命查询^Ge7Vdfs(Ge,7V){visit(7V);addTVtotreeJ";页foreachsuccessorJivofTVdoifisunvisited{dfs(Ge,rw);addarc<7V,JW>totreer;returnT7;根据本发明的一个实施例,用于生成有向生成树&的算法如下所示#入.'^"力查询窗Ge及详推现《i;才橫种才^^成#reconstructSpanningTree(Gg,7"J{treeTg=dfsT》;returnJ^;按照上面所述的深度优先遍历算法7和构建有向生成树算法c^m对m"5^mmVig7^^7对图4(a)所示的有向查询图Gg进行遍历后生成的有向生成树T^如图4(b)所示。图4(c)为图4(b)的等价表示,对图4(b)所示的有向生成树rg进行了调整,以便形成常用的分层树结构。在步骤S32中通逸逸历查询图Gg构建了有向生成树;之后,处理流程前进到步骤S33,在此通过广度优先搜索(BFS,BreadthFirstSearch)遍历有向生成树7^,以便迭代生成中间结果M。上面所提到的谓词^lt实例化也主要在这一步骤中完成。针对每一层树遍历构建临时表AT,以便级联查询中局部谓词(才艮据树的层次顺序可能为一个表的局部谓词,也可能为一组表的局部谓词)的参照列作为临时表3f的列组,然后构勤目关的SQL语句,以便从目标测试数据库中查找数据并且通过对列组值进行分组来检索聚合数据信息。下面首先针对单个表来讨论如何构建上述中间临时表AT,然后将其扩展到一般情况下的多个表。首先,考虑查询g中的表r,具有*个局部谓词r丄c产Aa...r丄c^A的情况,其中r丄c,是表r的列并且/7,为相应的^,u,、A:。现在模拟/ix(A+l)矩阵表M,如表2所示,其中/1是满足指定行集数约束c的组(r丄d,…,r丄C;t)的相异值的数量。这里,将特征值M[vM,…,VM,card;J(1^/^")定义为列组(r丄d,...,r丄G)的一个数据组,并且这意味着在选择第/i元组中的值来生成测试查询时,每一个外将被实例化为vA,(h/《A:)。因此,表r的局部谓词被精确地#*化为r丄c尸VMA…Ar丄C/pvM。值car&是列组的(r丄d,...,r丄G)数据组中的第a个最大的行集数。考虑用户所指定的行集数约束c(这里为了简洁起见先考虑单个行集数约束c的情况,对于多个行集数约束的情况将在下文中详细描述),仅在中间表M中保留满足条件card^c(ly^)的元组,而将表r的其他元组丟弃。<table>tableseeoriginaldocumentpage17</column></row><table>上述针对表T的矩阵Af可以通过下面的SQL语句ijb险索所有符合要求的记录并构建SELECTAf.iC,M.CARDFROM(SELECTr.IC,COUNTS)ASCARDFROMrWHERE1=1GROUPBYT.LCHAVINGCOUNT(*)>=cORDERBYCARDDESC)ASM这样,可以将所构建的矩阵M看作临时表,其中wx(A+l)矩阵3/是一个具有(A:+l)自由度并且M的行集数为w的表。在此,用Af丄C表示AT的局部谓词中的列集合(在单个表的情况下,7V/丄C等于r丄C),用M丄表示M的局部谓词的集合,用M/C表示M的联接谓词的列集合。对于单个表的情况,M/C等于等于传递闭包联接谓词集合r./c+。实际上,并不将联接的列构建到中间结果AT中,在这里定义列集合M/C仅仅用于M所有联接的列的信息。下面将把上面针对单个表的情况推广到更为一般的情形。现在考虑将Alx("l)矩阵作为现有的中间结果表以及另外还有一组表比如三个表ra、rp、和t;的情况。对于每一个元组MiVAi,.,VM,car(y(h/^w),构建下面的查询,其中每一个局部谓词T^丄C尸/;,的^故/7,.已经用值vw进行了实例化。SELECTiVMC,见CARDFROM(selectm"ic,nc,rp.ic,rY.ic,COUNT("ASCARDfrom應,ra,rp,rYWHERE1=1AND&.id=vuANDM工.JLC^ANDgroupbyM;l.:lc^rp-ic,r"cHAVINGCOUNT(*)>=cORDERBYCARDDESC//第一i蕴UNIONUNIONselectm丄.icvra.icvrp.i:c,:rv.i:c,COUNT(*)ASCARDFROMM工,ra,Tp,r7WHERE1=1ANDM"IA"wANDm丄.jgroupbym工.工c,ra._lc,rp.i<c,HAVINGCOUNT(*)>=cORDERBYCARDDESC//第h^蕴unionUNIONselecti^.工c,ra.ic,rp.ic,rY.i/c,COUNT(*)ASCARDfrom逃,ra,Tp,rYWHERE1=1AND逃.vnlANDMljGROUPBYHC,HCVrp.iC,rY.i<cHAVINGCOUNT(*)>=cORDERBYCARDDESC//第13i蕴18根据该构造的查询所得到的结果将形成(A:+i7;.丄ci+i7v丄q+i7v丄ci+i)维矩阵,该矩阵的行集数将由上述查询的合格的行的数量确定。M的局部谓词的列集合为AfL丄Cura丄Curp丄Cu7vzc,局部谓词集合Af丄为A^丄u7;丄uuT^L,而联接谓词的列集合为Ml/Cura./c+urp./Ourr/c+0根据本发明的一个实施例,将上述操作归结为生成中间结果矩阵的方法,称作genMatrix()。该方法具有三个输入^^t,中间结果表A^、一组表{71,...,7>1}、以及用户指定的行集数约束c,而该方法将返回新的中间结果M。^作为输出。实际上,该方法将才艮据输入M构建查询,以便从数据库中检索相关列组的聚合数据信息。对于单个表格r,更具体地说,该方法将实施为调用genMatrix(必,r,c),以4更检索其中间结果。总上所述可以看出,在这一步骤S33中,将有向查询图的有向生成树作为输入,按照层次顺序(BFS)来遍历该有向生成树,并且在每一层的处理期间迭代调用genMatrix(),以便生成中间结果表3f。还应该指出的是,可以允许行集数约束为一定的可接受的范围,而不一定必须如上面所描述的为一个精确的数目。在行集数约束c和指定的绝对偏差dW』)的情况下,允许最终的行集数c'的大小可以在[c-《c+《(c-fl^c、c+力的范围内。这样,在最后一次调用genMatrix()时,在相应构建的查询中的HAVING子句将被修改为HAVINGCOUNT(*)BETWEEN(cwOAND(c+力。当然,用户也可以自己指定合格的行集数c'为[c,c+rf]下面将结合上文中给出的具体实例更进一步地详细说明步骤S33中的处理.这里将图4(c)的有向生成树作为输入,并且假定行集数约束c为1000,偏差d为100,并且希望最后得到的行集数范围为[1000,1100。在该基础上,将按照以下各层次的遍历通过调用genMatrix()来生成满足行集数约束的最终中间结果3/。第一层次遍历,通过调用genMatrix(砂,71,1000)生成如下表3所示的中间结果Mi。表3M(T1)<table>tableseeoriginaldocumentpage19</column></row><table>GreenMajor56229BlueMajor23998VioletMinor9328WhiteMajor1816YellowMajor1386第一层次遍历相关的SQL语句可以如下构建SELECTM丄.iC,M.CARDFROM(SELECTri.Cl,rl.C8,COUNT("ASCARDFROMriWHERE1=1GROUPBYTl.Cl,T1.C8HAVINGCOUNT(">=1000ORDERBYCARDDESC)ASM丄,.第二层次遍历,通过调用genMatrix(Af^71,T3》,1000)生成如下表4所示的中间结果M2。表4恥(Tl,T2,T3)T1.C1T1.C8T2.C5T3.C6CARDBrownMinor2020Alabama2056BrownMinor2020Maine1560BrownMinor2020Arizona1260BlackMajor1098NewYork2105BlackMajor4648Utah1325BlackMajor1098California1309RedMajor4648California1207GreenMajor1354NewJersey1022第二层次遍历相关的SQL语句可以如下构建(为了筒洁起见仅仅示出了部分SQL语句)SELECTU:C,M2.CARDFROM(SELECTn.ci,rl.C8,r2.C5,r3.C6,COUNT。)ASCARDFROMri,r2,r3WHERE1=1ANDn.Cl=、Brown'ANDn.C8="Minor'AND:ri.C2=T2.C2ANDri.C4=72.C4ANDri.C3=73.C3GROUPBYri.Cl,.C8,r2.C5,T3.C6HAVINGCOUNT(*)>=1000ORDERBYCARDDESCUNIONUNIONSELECTTl.Cl,ri.C8,12.C5,T3.COUNT(*)ASCARDfromri,r2,WHERE1=1ANDri.ci=Tl.C8=ri.C2=ri.c4=ri.C3=r3、Yellow'AND、Major'ANDr2.C2ANDr2.C4AND十T3.C3groupbyri.c:uri.c8,r2.cs,r3.c6HAVINGCOUNT(*)>=1000ORDERBYCARDDESC)ASM2,.第三层次遍历,通过调用genMatrix(M2,r4,[1000,1100)生成如下表5所示的中间结果A/3。表5Af3(Tl,T2,T3,T4,最终结果)T1.C1T1.C8T2.C5T3.C6T4.C7CARDBrownMinor2020AlabamaDK1056BrownMinor2020MaineMV1030BrownMinor2020AlabamaKM1000BlackMajor1098CaliforniaWW1100BlackMajor1098NewYorkWD1100BlackMajor1098NewYorkDH1005第三层次遍历相关的SQL语句可以如下构建(为了简洁起见仅仅示出了部分SQL语句)SELECTM3.iC,M3.CARDFROM(SELECTrici,ri.C8,r2.C5,r3.T4.C7,COUNTdASCARDFROMri,r2,WHERE1=1ANDri.CI=、Brown'ANDri.C8=、Minor'ANDr2.C5=2020ANDr3.C6="Alabama'ANDr2.C4=r4.C4GROUPBYri.Cl^ri.C8,r2.C5,T3.C6,T4.C7HAVINGCOUNT(*)BETWEEN1000AND1100ORDERBYCARDDESCunionUNIONSELECTTl.Cl,rl.C8,r2.C5,r3.C6,r4.C7,COUNT(*)ASCARDFROMri,r2,T3,T4WHERE1=1ANDri.ci=ri.c8=r2.C5=r3.C6=ANDAND、Major'1354AND、NewJersey'AND21GROUPBYri.Cl,rl.C8,T2.C5,T3.C6,r4.C7HAVINGCOUNT("BETWEEN1000AND1100ORDERBYCARDDESC)ASAf3;现在回到图3,在步骤S33中生成中间结果Af之后,处理流程前进到步骤S34,判断是否遍历了所有的顶点。如果没有遍历所有顶点,则返回步骤S33,继续遍历有向生成树re,直到遍历完所有的顶点。如果在步骤S34中判断遍历了所有的顶点,并且生成了满足最终行集数约束c'的最终中间结果M,则处理流程前进到步骤S35,根据最终中间结果M生成候选测试查询6'。这样,对于w路联接查询g和行集数约束c,能够检索使得0满足^的列组(71丄(:,...,7>1丄0的所有合格元组。相应地,根据最终中间结果M通过实例化每一个参数值即能够自动地生成候选测试查询g'。另外,在此定义相对偏差作为测试用例的评价因子,其中相对偏差=maXC)(如果f或C'为0,则任意地将其用l替代)。用户能够才艮据相对偏差方便地从所生成的候选测试用例中选择一组子集合查询作为所期望的最后结果。对于上文中提到的具体实例,在这一步骤S35中才艮据表5所示的最终中间结杲A/3可以得到如下表6所示的候选测试查询0。表6候选测试查询<table>tableseeoriginaldocumentpage22</column></row><table><table>tableseeoriginaldocumentpage23</column></row><table><table>tableseeoriginaldocumentpage24</column></row><table>COUNTdASCARDFROMrWHERE1=1GROUPBYr.id,ORDERBYn卜2,r.icwasc,r._LCJcDESC,CARDASC对于该SQL语句的结果,可以将其看作临时的wx("l)矩阵ATr。考虑矩阵Mr中的如下p(A:+l)矩形区域对于矩阵Mr中的每一个值w,》和wy>(1^9,1^/^F,1s/^A:-2)总有附,对于矩阵Mr中的每一个值附,^i)和附wi)(1"^/、力总有附映d^附/(w),以及对于矩阵jfr中的每一个值附汰和附,(1^,'^/、力,如果附砂-1)=柳y(A-i)则总有附汰2附#。下面的表7示出了一个这样的矩形区域,例如,r丄d的所有值等于fl,r丄G的所有值等于6,r丄cv-2的所有值等于z,r丄c^的所有值具有单调特性,当s/^y时"^,以及在^尸的条件下r丄cv的所有值具有单调特性,当《、W时v^v,y。表7矩形区域及#1#2#&-2欲r丄C2r丄GCARDWW1card"Icard^针对该矩形区域及r,通过使用函数subsume(cards,)=X<>card将第(A+1)列(列CARD)的值计算为5^x1矢量^subsu—cardw)subsum(cardw-J,然后用该矢量爿替换矩阵区域Wr的第(A+l)列的原始值,如下面的表8所示,表8替换后的矩形区域i^#1r丄d#26吣l'r丄G1i#(&+i)CARDsubsum(ca喊subsum(card斗tsubsum(cardj在该修正后的矩形区域中,丢弃了subsum(cardj<c的元组以便形成新的矩形区域A。因此,可以推断当将局部谓词实例化为A的第s/行A:元组i^[fl,6,…,;Mw,Vs,]时,subsum(cardj的值能够更准确地等于最终的行集数约束c'。针对初始查询^所生成的相关候选查询g'如下所示,其实际的约束c'大于行集数约束c(0'满足c)。SELECTSFROMrWHEREr.IAr,ic2=aAND=jbANDr.iC大-2=zANDT.I;Ch2usiANDr.工C;c2vsi;在整个矩阵Mr中,genMatrix()方法将查找所有这种类型的矩形区域,针对每一个这样的区域分别调用subsum()函数,并且丢弃不合格的元组,最后联合所有剩余的元组以生成新的矩阵A^作为最终结果。对于其他的双侧范围谓词和多个表查询的情况,也可以根据类似的原理修改genMatrix()来生成最终的中间结果矩阵。另夕卜,在某些情况下,在步骤S31中生成的有向查询图中可能存在多于一个的根顶点。图5(a)示出违背一个根顶点期望的IO路联接有向查询图。当使用多个根对有向查询图进行遍历时,将构建有向生成森林,其包括一组断开的有根的有向生成树来替代单个有向生成树。有向生成森林中的有向生成树的数量通常由有向查询图中的根顶点的数量来决定。例如,对于图5(a)所示的有向查询图,在构建的有向生成森林中存在两个有向生成树,如图5(b)所示。从该示例中可以看出,在针对多个根顶点的有向查询图生成有向生成森林后,可能会丟失某些潜在的联接关系。因此,针对这种情况,必须对图3所示的方法进行改进以涵盖这种情况。首先,在步骤S31之后增加子步骤S31+,以便标识有向查询图中的M点和桥接弧。通常情况下,接合点(也称作切割顶点)和桥接边是无向图中的概念,用来表示图的连通特征。在本发明的实施例中,将这些概念借用到有向图中来说明本发明。在有向查询图中Ge,考虑三个顶点r"、7V和IV,如果存在两个弧<71/,7^>和<7>,rw>,并且TV的入度iV/(7V)^2,但是从r"到TV或者从7v到r"没有路径,则将顶点TV定义为掩^点,并且将TV添加到接合点集合7Vg;Ke。同时,在此将弧〈r",7^>和<7>,7^>称作桥接弧并将他们添加到桥接弧集合丑e={<I7,0>I77eKea"e7Vear!V7/}。在图5(a)所示的示例中,#2={12}并且52={<T0,T2>,<T1,T2>,<T6,T2>,<T3,T2>}。然后在步骤S32中,通过有向查询图Gg中的每一个才艮顶点遍历有向查询图Ge来构建有向生成森林Fg。在此筒要描述根据本发明一个实施例的构建有向生成树的方法。针对图5(a)所示的有向查询图,在构建了如图5(b)所示的有向生成森林/^之后,TO和T2在一棵有向生成树上,而Tl、T3和T6在另一棵有向生成树上,在所生成的有向生成森林中这两,相互断开。因此,在步骤S32的构建有向生成森林的过程中丢失了他们的联接关系。为了准确地保留这些联接关系,需要增加子步骤S32+,以便通过连接不同有向生成树中的相关顶点来将在步骤S32中构建的有向生成森林转换成新的有向生成森林。在此通过一类特殊的弧,即"虚拟弧"来链接所有的这些联接关系,在有向生成森林中用虚线弧表示。如图5(c)所示,在该示例中,经过有向生成森林变换之后的虚拟弧为用虚线表示的弧{<11,T2>,<T6,T2>,<T3,T2>}。进行有向生成森林变换的算法如下所示。"絲賴"颠#法"翁入;才/^查询^^0及详旅现威桌合及0餘A:逸括一个4^个^"橫^T命i成浙reFeconstructSpanningForest(Gg,尺g){forest&=0;foreachrootvertexreigdotree二dfs(Gg,r);returni7^;"义财^4'颠#法"^f/^i成溁淋i^及脊凝^C漠合5e翁/^.'^换^好|^^^^#尸2,及新辨脊凝级桌合5g,tramformSpanningForest(Fg,{foreacharce5。doifarc</,_/>existsinanyofspanningtree7^=52-〃removearc</,_/>from5^ifvertex/gspanningtree7^andvertexespanningtree(/八J1^#Tgs)i72=U</,/>;〃addvirtualarctoF2return(Fg,B。);最后,在步骤S33中分别针对每一个有向生成树生成中间结果,然后可以将每一个中间结果看作临时表,而虚拟弧则表示有向生成树之间的联接关系。这样,将每一个中间结果作为一个虚拟顶点,如图6所示,然后迭代调用genMatrix()直到遍历了有向生成树中的所有虚拟顶点为止。此夕卜,还应该指出的是,在前面的实施例中是以没有子查询的查询为例it行说明的。但是,本发明不仅限于此,而是也可以应用到具有子查询的查询中。虽然对于大多数具有子查询的情况只关注其某一类特定的子查询而不是整个查询,由此可以应用上面所述的方法针对该类特定的子查询构建满足行集数约束的候选查询,但是,本发明也可以针对一般的查询级别而不是特定的子查询来构建满足行集数约束的候选查询。对于包含不相关子查询的查询,可以从最深层的子查询开始,构建该子查询的有向查询图、构建其有向生成树、以及调用genMatrix(),以便针对该子查询生成中间结果。然后,将该中间结果作为虚拟顶点,并通过在有向生成森林中添加虚拟弧来处理其上一层子查询。这样,可以从最深层的子查询开始迭^f戈处理所有层次的子查询。图7示出了处理多层次子查询的一个示例。对于包^^目关子查询的查询,可以首先将这些相关的子查询去相关,将他们变为不相关的子查询,然后再应用本发明的上述方法即可。关于相关子查询的去相关方法,请参见美国专利US5,548,755、PraveenSeshadri,HamidPirahesh,T.Y.CliffLeung的"ComplexQueryDecorrelation",IniVocm/,Vf^s6>/J加/"fmi她Vmfl/CVw^^Mce<m五"giViemVig(ICDE1996),1996、以及P.Seshadri,J.M.Hellerstein,H.Pirahesh,T.Y.CliffLeung,R.Ramakrishnan,D.Srivastava,P.J.Stuckey,S.Sudarshan的"Cost-basedoptimizationformagic:algebraandimplementation",In^CM57GAfOi)及ecwY/,1996等有关文献,在此略去其详细说明。另外还应该指出的是,可以将上文中描述的单个行集数约束c扩展到多个行集数约束,这里用行集数集合C表示。考虑具有/层的有向生成树re,可以制定多个行集数约束CMd,…,d每一个行集数约束c,.(h"/)用于在树遍历期间控制第/次调用genMatrix()时的中间结果的大小。例如,对于图4(c)中的有向生成树,在遍历期间可以将行集数约束规定为0{cei,ce2,ce3}。更具体地,可以将单个行集数约束看作多个行集数约束的特例,只不过每一个行集数约束c,彼此均相等而已。相应地,对于具有r个有向生成树、每一个树7^(ls"。具有W层的有向生成森林/^,则可以指定行集数约束C》{c11,.."c1,,.",q1,.."Q,"..,cv1,""cv,,c1"..,Cm}。例如,对于图5(b)所示的示例,可以指定行集数约束集合为0{^,Q2,Q3,C51,Cs2,C幼C54,Ci}o以这种方式,可以提供灵活的方式通过指定多个行集数约束来控制每一个中间结果的大小。此外,还应该注意的是,查询访问计划通常都图形化为左深树,如图8所示。在这种情况下,才艮据本发明的一个实施例,调用genMatrix()的顺序则是根据访问计划的联接顺序来进行,而不;l按照上面所述的层次顺序来进行遍历。以图8所示的实例为例,其:^接顺序为77->r2->D,在此指定行集数约束CHd,C2,C3,C4,C^来控制每一个中间结果的大小。按照访问计划的^t接顺序,对于图8所示的左深树,genMatrix()首先构建下述SQL语句,以便针对表77生成如表9所示的满足行集数约束d的中间矩阵M;。FROM(SELECTHCll,COUNT(*)ASCARDFROMriWHERE1=1GROUPBYri.iCllHAVINGCOUNTd>=c工ORDERBYCARDDESC)AS线;表线(Tl)Tl,LCllCARDcardwlca《接着,genMatrix()联接中间结果7V^和表72以生成如表10所示的满足行集数约束^2的中间结果3/2,其相应的SQL语句如下所示。SELECTM2.iC,iVf2.CARDFROM(SELECTri.iCll,r2.工C21,COUNTdASCARDFROMTl,272WHERE1=1ANDri.iCll=ulri.JC12=U22GROUPBYri.iCll,T2.iC21HAVINGCOUNT(">=c2ORDERBYCARDDESC//ulUNIONUNIONselectri.icii,r2.i:c21,COUNT(*)ASCARDFROMri,72WHERE1=1ANDri.JLCll=uxri.JC12=T2.JU22GROUPBYri.iCll,r2.iC21HAVINGCOUNT>=c2ORDERBYCARDDESC//ux)ASAf2表10M2(T1,T2)Tl丄CllT2丄C21CARDcarcUi30"J7card;wv,然后,genMatrix()通过将r2丄d用中间结果M2中的值进行实例化来针对表72构建下述SQL语句,以便生成满足行集数约束c3的中间结果Mj,如表11所示。selectm3.:lc,m3.cardFROM(SELECTHC21,COUNT(*)ASCARDFROMr2WHEREr2.工C21=vlGROUPBYr2.iC21HAVINGCOUNT(">=c3ORDERBYCARDDESC//vlUNIONUNIONSELECTT2.iC21,COUNT(*)ASCARDFROMT2WHEREr2.JLC21=vyGROUPBYT2.iC21HAVINGCOUNT(*)〉=c3ORDERBYCARDDESC)ASiVf3表11M3(T2)T2丄C21CARDvlcardvicardvz在联接表77和72期间为了满足行集数约束c3,需要丢弃中间结果矩阵M2中r么丄czv/的值g矩阵^3中r2.丄c7v/'的任意值的元组。由此,可以得到删减后的中间结果M2',如下表12所示。表12M2'(T1,T2)Tl丄CllT2丄C21CARDvl'cardwi'vz'类似的,使用中间结果M联接表73,以便使结果满足行集数约束C4并生成新的中间结果3f4,如表13所示。相应的SQL语句如下所示SELECT线.化,M4.CARDfrom(SELECTri.iCll,T2.iC21,r3.iC31,T3.iC32,COUNT(*)ASCARDfromri,r2,r3WHERE1=1ANDri.iCll=ul'ANDr2.iC21=vl'GROUPBYHCll,HC21,r3.工C31,r3.工C32HAVINGCOUNT(*)>=c4ORDERBYCARDDESC//uvl'UNIONUNIONSELECTTl.I/Cll,T2.iC21,T3.iC31,r3.I;C32,COUNT(*)ASCARDfromri,r2,r3where1=1andri.iCll=uz'ANDr2.iC21=vz'GROUPBYrl.iCll,r2.ic21,r3.ic3:ur3.iC32HAVINGCOUNT(*)>=c4ORDERBYCARDDESC//uvz')ASM4'-表13Af4(Tl,T2,T3)Tl丄CllT2丄C21T3丄C31T3丄C32CARD〃vl","aw謂为了满足行集数约束c5,genMatrix()使用中间结果Af4中的值实例化列组(73丄C37,r3丄C^2),从而针对表73构建下述SQL语句,以便生成新的中间结果Afs。SELECTM5.iC,M5.CARDFROM(SELECTr3.iC31,r3.工C32,COUNT(*)ASCARDFROMT3WHERET3.iC31=wlAM)GROUPBYr3._LC31,HAVINGCOUNT(*)>=c5ORDERBYCARDDESC//(wl,ul)UNIONUNIONSELECTr3.1C31,T3.iC32,COUNT(*)ASCARDFROMr3WHEREr3.JLC31=,AATOGROUPBYr3.iC31,r3.1C32HAVINGCOUNT(*)>=c5ORDERBYCARDDESC//(aw,—)ASM5最后,丟弃中间结果A/4中列组(7XLC/,IXLC》(^/,1^的值g中间结果矩阵Ms中列组(T3丄c^,r3丄c"(^y,"》的任意值的元组,以便获得删减的最终中间结果M4'。可以看出,使用该中间结果M/进行谓词^lt实例化能够满足行集数约束集合0{Cl,C2,c3,c4,c5}的要求。以上结合附图详细描述了实现本发明的自动生成数据库查询的方法的各个具体实施方式,下面将结合图9描述本发明的自动生成数据库查询的系统。如图9所示,根据本发明的一个实施例的自动生成数据库查询的系统主要包括查询图生成模块910、查询生成模块920、以及测试用例生成模块930。查询图生成模块910用于对输入的查询0进行分析,以^更生成其有向查询图和有向生成树。查询图生成模块910主要包括有向查询图构建器912,用于对输入的查询g构建有向查询图;有向生成树/森林构建器914,用于根据有向查询图构建器所构建的有向查询图构建有向生成树,或者构建有向生成森林并对其进行转换;图形可视化器916,用于对有向查询图构建器912构建的有向查询图和有向生成树/森林构建器914构建及转换的有向生成树/森林进行可视化显示;以及图形可视化器用户接口918,用于实现与用户的交互。查询生成模块920用于对查询图生成模块910所生成的有向生成树/森林进行遍历以便生成满足行集数约束条件的候选测试查询。查询生成模块920主要包括符号化查询表示器922,用于将输入查询转化为符号化表示的查询;矩阵生成器924,用于对查询图生成模块910所生成的有向生成树/森林进行广度优先搜索,构建SQL语句以便迭代生成中间结果表;谓词M实例化单元926,用于在矩阵生成器924迭4义生成中间结M期间,根据上一层次遍历的中间结果表对新构建的SQL语句中的谓词^进行实例化表示,从而使得矩阵生成器924生成最终的满足行集数约束条件的中间结^;以及候选查询生成器928,用于根据矩阵生成器924生成的最终中间结果生成一组候选测试查询,如果必要,可以选择输出满足相对偏差要求的优选测试查询。其中,符号化查询表示器922为可选模块,可以不必对输入查询进行符号化而直接处理输入的查询,也可以在对输入查询进行符号化处理之后发送给查询图生成模块910,以方i更查询图生成模块的处理。当然,在最终生成测试查询时,应当将符号化表示的查询进行反符号化处理,返回到实际查询中所^^用的查询元素。测试用例生成模块930才艮据查询生成模块920所生成的测试查询生成测试用例,主要包括候选查询评价器932,用于评价查询生成模块920所生成的测试用例候选;测试用例生成器934,用于根据候选查询评价器932的评价结果,为用户4C供符^^要求的测试用例;以及测试用例生成器用户接口936,用于与用户交互。以上各个模块和单元的具体处理过程与上面参照的自动生成数据库查询的方法的各个实施例中的相应步骤相类似,为了简洁起见,在此略去其详细描述。另外,在数据库层950中提供了测试查询存储库952用以保存用户提供的测试工作负载(一组查询)的所有相关信息、行集数约束规范、以及所生成的可以重复4吏用的测试用例等等。当然,在数据库层950中还M有用于进行查询测试的测试数据库954。此外,根据本发明的自动生成数据库查询的系统具有很好的扩展性,能够通过数据抽象层940方便地与其他用户工具和其他外部模块960集成。例如,外部模块960中的测试数据生成器962、测试自动^f匕工具964、性能测试工具966、数据库测试工具968等工具与本发明各个实施例所提供的技术方案具有很好的兼容性。还应该指出的是,根据本发明的自动生成数据库查询的方法和系统也支持基于关键字和基于相似性的搜索功能。以上结合具体实施例描述了本发明的基本原理,但是,需要指出的是,对本领域的普通技术人员而言,能够理解本发明的方法和装置的全部或者任何步骤或者部件,可以在任何计算设备(包括处理器、存储介质等)或者计算设备的网络中,以硬件、固件、软件或者它们的组合加以实现,这是本领域普通技术人员在阅读了本发明的说明的情况下运用他们的基本编程:技能就能实现的,因此在这里省略了详细il明。因此,基于上述理解,本发明的目的还可以通过在任何信息处理设备上运行一个程序或者一组程序来实现。所述信息处理设备可以是公知的通用设备。因此,本发明的目的也可以仅仅通过提供包含实现所述方法或者设备的程序代码的程序产品来实现。也就是说,这样的程序产品也构成本发明,并且存储有这样的程序产品的存储介质也构成本发明。显然,所述质,因此也没有必要在此对各种存储介质——列举。在本发明的设备和方法中,显然,各部件或各步骤是可以分解和/或重新组合的。这些分解和/或重新组合应视为本发明的等效方案。并且,是并不需要一定按照时间顺序执行。某些步骤可以并行或彼此独立地执行。以上描述了本发明的优选实施方式。本领域的普通技术人员知道,本发明的保护范围不限于这里所公开的具体细节,而可以具有在本发明的精神实质范围内的各种变化和等效方案。权利要求1.一种生成数据库查询的方法,包括步骤接收输入查询和行集数约束;以及根据数据库的列组数据相关性对输入查询的局部谓词参数进行实例化,以生成满足行集数约束的候选测试查询。2.根据权利要求l所述的方法,其中生成测试查询的步骤包括步骤:为输入查询构建有向查询图;对有向查询图进行遍历以构建有向生成树;对有向生成树进行遍历以生成中间结果表;以及根据中间结M生成满足行集数约束的候选测试查询。3.根据权利要求2所述的方法,其中按照参照完整性关系为输入查询构建具有才艮顶点的有向查询图;通过深度优先遍历对有向查询图进行遍历以构建有向生成树;以及通过广度优先搜索对有向生成树进行遍历以生成中间结果表。4.根据权利要求3所述的方法,其中生成中间结果表的步骤按照层次顺序对有向生成树进行遍历,并且包括步骤针对每一层的有向生成树遍历,级联输入查询中局部谓词的参照列作为中间结果表的列组;通过对列组值进行分组从数据库中检索聚合数据信息;以及在中间结果表中保留各列组值均满足行集数约束的列组值并在中间结果表中记录行集数。5.根据权利要求4所述的方法,其中行集数约束c为在可接受范围内的行集数约束C',并且所述方法还包括根据"相对偏差-max(^f)"对所生成的候选测试查询进行评价的步骤,以从中选择一组期望的测试查询。6.根据权利要求1至5任一所述的方法,其中局部谓词包括等于谓词、单侧i胃词、以及双侧谓词。7.根据权利要求2至5任一所述的方法,其中在为输入查询构建的有向查询图为多于一个根顶点的情况下,所述方法还包括步骤在构建有向查询图之后,标识有向查询图中的接合点和桥接弧;在构建有向生成树之后,通过虚拟弧链接不同有向生成树中的相关顶点,以将构建有向生成树步骤所构建的多个有向生成树转换成有向生成森林;以及在中间结果表生成步骤中分别针对每一个有向生成树生成中间结果,然后将每一个中间结果表看作临时表,将虚拟弧作为有向生成树之间的联接关系,以进一步生成最终的中间结果表。8.根据权利要求2至5任一所述的方法,其中查询包括子查询,并且如果子查询为相关子查询,将其去相关为不相关子查询;所述方法在生成候选测试查询之前还包括步骤从最深层的子查询开始直到最外层子查询,逐层迭代生成中间结果表。9.根据权利要求2至5任一所述的方法,其中行集数约束为多个行集数约束,分别用于有向生成树的各层。10.根据权利要求2至5任一所述的方法,其中在有向生成树为左深树的情况下,根据查询访问计划的的联接顺序来逐层生成中间结果表。11.一种生成数据库查询的系统,包括有向查询图构建器,用于为输入查询构建有向查询图;有向生成树构建器,用于对有向查询图进行遍历以构建有向生成树;矩阵生成器,用于对有向生成树进行遍历以生成中间结果表;以及候选查询生成器,用于根据中间结果表生成满足行集数约束的候选测试查询。12.根据权利要求ll所述的系统,其中有向查询图构建器按照参照完整性关系为输入查询构建具有根顶点的有向查询图;有向生成树构建器通过深度优先遍历对有向查询图进行遍历以构建有向生成树;以及矩阵生成器通过广度优先搜索对有向生成树进行遍历以生成中间结13.根据权利要求12所述的系统,其中矩阵生成器按照层次顺序对有向生成树进行遍历,并且针对每一层的有向生成树遍历,级联输入查询中局部谓词的参照列作为中间结果表的列组;通it^f列组值进行分组从数据库中检索聚合数据信息;以及在中间结果表中保留各列组值均满足行集数约束的列组值并在中间结果表中记录行集数。14.根据权利要求13所述的系统,还包括候选查询评价器,用于根据"相对偏差-max(f,,)"对候选查询生成器生成的候选测试查询进行评价以从中选择一组期望的测试查询,其中c为行集数约束,c'为在可接受范围内的行集数约束。15.根据权利要求11至14任一所述的系统,其中局部谓词包括等于谓词、单侧谓词、以及双侧谓词。16.根据权利要求11至14任一所述的系统,其中在有向查询图构建器为输入查询所构建的有向查询图为多于一个才艮顶点的情况下,所述有向查询图构建器在构建有向查询图之后,标识有向查询图中的掩^点和桥接弧;所述有向生成树构建器在构建有向生成树之后,通过虚拟弧链接不同有向生成树中的相关顶点,以将构建有向生成树步骤所构建的多个有向生成树转换成有向生成森林;以及所述矩阵生成器分别针对每一个有向生成树生成中间结果,然后将每一个中间结^看作临时表,将虚拟弧作为有向生成树之间的联接关系,以进一步生成最终的中间结果表。17.根据权利要求11至14任一所述的系统,其中查询包括子查询,并且如果子查询为相关子查询,将其去相关为不相关子查询;并且所述矩阵生成器从最深层的子查询开始直到最外层子查询,逐层迭^R生成中间结a。18.根据权利要求11至14任一所述的系统,其中行集数约束为多个行集数约束,分别用于有向生成树的各层。19.根据权利要求11至14任一所述的系统,其中在有向生成树为左深树的情况下,所述矩阵生成器才艮据查询访问计划的的联接顺序来逐层生成中间结果表。20.根据权利要求11至14任一所述的系统,还包括测试查询存储库,用以*输入查询的相关信息、行集数约束规范、以及所生成的可以重复^f吏用的测试用例。全文摘要本发明公开了一种自动生成数据库查询的方法和系统,通过考虑列组数据相关性和行集数约束,能够基于谓词参数实例化自动生成用于数据库的查询。根据本发明一个实施例的生成数据库查询的方法包括接收输入查询和行集数约束;以及根据数据库的列组数据相关性对输入查询的局部谓词参数进行实例化,以生成满足行集数约束的候选测试查询。所述生成测试查询的步骤包括步骤为输入查询构建有向查询图;对有向查询图进行遍历以构建有向生成树;对有向生成树进行遍历以生成中间结果表;以及根据中间结果表生成满足行集数约束的候选测试查询。文档编号G06F17/30GK101620606SQ20081012529公开日2010年1月6日申请日期2008年6月30日优先权日2008年6月30日发明者刘长浩,硕武申请人:国际商业机器公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1