自动生成数据库查询的方法和系统.pdf

上传人:a2 文档编号:999600 上传时间:2018-03-24 格式:PDF 页数:41 大小:1.84MB
返回 下载 相关 举报
摘要
申请专利号:

CN200810125297.9

申请日:

2008.06.30

公开号:

CN101620606A

公开日:

2010.01.06

当前法律状态:

终止

有效性:

无权

法律详情:

专利权的视为放弃IPC(主分类):G06F 17/30放弃生效日:20100106|||实质审查的生效|||公开

IPC分类号:

G06F17/30

主分类号:

G06F17/30

申请人:

国际商业机器公司

发明人:

武 硕; 刘长浩

地址:

美国纽约

优先权:

专利代理机构:

北京集佳知识产权代理有限公司

代理人:

康建峰;李春晖

PDF下载: PDF下载
内容摘要

本发明公开了一种自动生成数据库查询的方法和系统,通过考虑列组数据相关性和行集数约束,能够基于谓词参数实例化自动生成用于数据库的查询。根据本发明一个实施例的生成数据库查询的方法包括:接收输入查询和行集数约束;以及根据数据库的列组数据相关性对输入查询的局部谓词参数进行实例化,以生成满足行集数约束的候选测试查询。所述生成测试查询的步骤包括步骤:为输入查询构建有向查询图;对有向查询图进行遍历以构建有向生成树;对有向生成树进行遍历以生成中间结果表;以及根据中间结果表生成满足行集数约束的候选测试查询。

权利要求书

1: 一种生成数据库查询的方法,包括步骤: 接收输入查询和行集数约束;以及 根据数据库的列组数据相关性对输入查询的局部谓词参数进行实例 化,以生成满足行集数约束的候选测试查询。
2: 根据权利要求1所述的方法,其中生成测试查询的步骤包括步骤: 为输入查询构建有向查询图; 对有向查询图进行遍历以构建有向生成树; 对有向生成树进行遍历以生成中间结果表;以及 根据中间结果表生成满足行集数约束的候选测试查询。
3: 根据权利要求2所述的方法,其中: 按照参照完整性关系为输入查询构建具有根顶点的有向查询图; 通过深度优先遍历对有向查询图进行遍历以构建有向生成树;以及 通过广度优先搜索对有向生成树进行遍历以生成中间结果表。
4: 根据权利要求3所述的方法,其中生成中间结果表的步骤按照层 次顺序对有向生成树进行遍历,并且包括步骤: 针对每一层的有向生成树遍历,级联输入查询中局部谓词的参照列作 为中间结果表的列组; 通过对列组值进行分组从数据库中检索聚合数据信息;以及 在中间结果表中保留各列组值均满足行集数约束的列组值并在中间 结果表中记录行集数。
5: 根据权利要求4所述的方法,其中行集数约束c为在可接受范围 内的行集数约束c′,并且所述方法还包括根据 对所 生成的候选测试查询进行评价的步骤,以从中选择一组期望的测试查询。
6: 根据权利要求1至5任一所述的方法,其中局部谓词包括等于谓 词、单侧谓词、以及双侧谓词。
7: 根据权利要求2至5任一所述的方法,其中在为输入查询构建的 有向查询图为多于一个根顶点的情况下,所述方法还包括步骤: 在构建有向查询图之后,标识有向查询图中的接合点和桥接弧; 在构建有向生成树之后,通过虚拟弧链接不同有向生成树中的相关顶 点,以将构建有向生成树步骤所构建的多个有向生成树转换成有向生成森 林;以及 在中间结果表生成步骤中分别针对每一个有向生成树生成中间结果, 然后将每一个中间结果表看作临时表,将虚拟弧作为有向生成树之间的联 接关系,以进一步生成最终的中间结果表。
8: 根据权利要求2至5任一所述的方法,其中查询包括子查询,并 且如果子查询为相关子查询,将其去相关为不相关子查询; 所述方法在生成候选测试查询之前还包括步骤:从最深层的子查询开 始直到最外层子查询,逐层迭代生成中间结果表。
9: 根据权利要求2至5任一所述的方法,其中行集数约束为多个行 集数约束,分别用于有向生成树的各层。
10: 根据权利要求2至5任一所述的方法,其中在有向生成树为左深 树的情况下,根据查询访问计划的的联接顺序来逐层生成中间结果表。
11: 一种生成数据库查询的系统,包括: 有向查询图构建器,用于为输入查询构建有向查询图; 有向生成树构建器,用于对有向查询图进行遍历以构建有向生成树; 矩阵生成器,用于对有向生成树进行遍历以生成中间结果表;以及 候选查询生成器,用于根据中间结果表生成满足行集数约束的候选测 试查询。
12: 根据权利要求11所述的系统,其中: 有向查询图构建器按照参照完整性关系为输入查询构建具有根顶点 的有向查询图; 有向生成树构建器通过深度优先遍历对有向查询图进行遍历以构建 有向生成树;以及 矩阵生成器通过广度优先搜索对有向生成树进行遍历以生成中间结 果表。
13: 根据权利要求12所述的系统,其中矩阵生成器按照层次顺序对 有向生成树进行遍历,并且: 针对每一层的有向生成树遍历,级联输入查询中局部谓词的参照列作 为中间结果表的列组; 通过对列组值进行分组从数据库中检索聚合数据信息;以及 在中间结果表中保留各列组值均满足行集数约束的列组值并在中间 结果表中记录行集数。
14: 根据权利要求13所述的系统,还包括候选查询评价器,用于根 据 对候选查询生成器生成的候选测试查询进行评价 以从中选择一组期望的测试查询,其中c为行集数约束,c′为在可接受范 围内的行集数约束。
15: 根据权利要求11至14任一所述的系统,其中局部谓词包括等于 谓词、单侧谓词、以及双侧谓词。
16: 根据权利要求11至14任一所述的系统,其中: 在有向查询图构建器为输入查询所构建的有向查询图为多于一个根 顶点的情况下,所述有向查询图构建器在构建有向查询图之后,标识有向 查询图中的接合点和桥接弧; 所述有向生成树构建器在构建有向生成树之后,通过虚拟弧链接不同 有向生成树中的相关顶点,以将构建有向生成树步骤所构建的多个有向生 成树转换成有向生成森林;以及 所述矩阵生成器分别针对每一个有向生成树生成中间结果,然后将每 一个中间结果表看作临时表,将虚拟弧作为有向生成树之间的联接关系, 以进一步生成最终的中间结果表。
17: 根据权利要求11至14任一所述的系统,其中查询包括子查询, 并且如果子查询为相关子查询,将其去相关为不相关子查询;并且 所述矩阵生成器从最深层的子查询开始直到最外层子查询,逐层迭代 生成中间结果表。
18: 根据权利要求11至14任一所述的系统,其中行集数约束为多个 行集数约束,分别用于有向生成树的各层。
19: 根据权利要求11至14任一所述的系统,其中在有向生成树为左 深树的情况下,所述矩阵生成器根据查询访问计划的的联接顺序来逐层生 成中间结果表。
20: 根据权利要求11至14任一所述的系统,还包括: 测试查询存储库,用以保存输入查询的相关信息、行集数约束规范、 以及所生成的可以重复使用的测试用例。

说明书


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

    【技术领域】

    本发明涉及数据库软件系统的测试技术。更具体地说,本发明涉及自动生成数据库查询的方法和系统,通过考虑列组数据相关性(ColumnGroup Data Correlation)和行集数约束(Cardinality Constraint),能够基于谓词参数实例化(instantiation)自动生成用于数据库的查询。

    背景技术

    自动地生成用于测试数据库引擎的新功能(比如优化器算法)的查询以及用于评估数据库应用(例如电子商务应用)的性能的查询在实践中是一项非常令人气馁的工作。在许多测试情形中,需要非常仔细地的设计测试查询,这往往使得测试工作十分辛苦并耗费大量时间。

    对在数据库引擎中新设计和/或新开发的功能,比如新优化器算法进行性能和质量的测试,验证相对改进的常用方法是生成一组测试数据和查询,然后比较施加新功能之前和之后数据库系统的行为。显然,对于给定的测试数据库,合理的测试方案应当涵盖具有宽范围的模式和特征各种查询。另外,针对特定测试目的/方案,非常希望能够控制测试查询的输入(例如,参数值,谓词过滤,以及选择条件等等)和输出(例如,中间查询结果和行集数等等)。但是,对于业界和学术领域的当前装备来说,获取如上所述期望的测试查询几乎是不可能的,这是因为所生成的查询是独立于测试数据库的。结果,在大多数情形下不得不忍受“尝试-失败”所带来的不利后果。

    对于评估数据库应用的性能和测试数据库应用的鲁棒性而言,由于诸多众所周知的优点,比如效率、灵活性和安全性,因此当今的应用大多使用具有参数标记(parameter marker)或主变量(host variable)的动态查询。此类动态SQL的使用对基于成本的数据库优化器提出了巨大挑战,并且作为结果可能导致查询潜在的性能退化,这是因为经常确定无效的访问路径。由于在使用参数标记模糊化搜索条件的情况下,优化器的估计仅仅简单地基于默认值和改写(interpolation)、猜测工作的种类,结果是不能区分有效和无效访问路径。因此,测试具有潜在输入变化的查询性能非常重要。,然而,对于所有的参数标记测试有意义的输入值非常困难,这是因为在应用运行期间所有的参数都是动态设置的。即使在运行应用时进行测试,不仅显著增加测试工作的复杂性和繁琐程度,而且也难以保证探究所有的主要可能情况(比如,最大/最小值、数据偏斜、以及数据相关性等等)。

    因此,对于与数据库管理系统(DBMS,database management system)相关的测试,非常需要能够以自动并且可控的方式来生成期望的测试查询。

    当前业界和学术领域已经针对自动生成查询进行了一些研究并提出了相应的自动生成查询的方法。但是,在这些自动查询生成解决方案中,大多数都不针对测试的目的。比如,在美国专利US6,285,998中提出了一种允许用户针对数据库查询快速指定期望值并保存查询以便再使用的查询方法。虽然能够方便地生成并且容易地再使用查询,但是该方法并不能解决测试数据库性能的问题。

    另外,在测试查询生成领域,从有关于测试数据库和测试查询之间的关系方面来看,存在两种主要的方案。第一种方案不考虑数据而生成查询,此类解决方案不能处理上面所讨论的两种情形,即,对在数据库引擎中新设计和/或新开发的功能进行性能和质量的测试、以及评估数据库应用的性能和测试数据库应用的鲁棒性,这是因为此类解决方案均设计为生成通用目的的查询。例如,在J.Tuya,M.J.Suárez-Cabal和C.la Riva发表的“Mutating database queries”,Journal of Information and SoftwareTechnology,2007,Elsevier中将突变测试概念引入DBMS测试中,通过对查询生成一组突变因子来确保SQL测试的涵盖范围。但是,通过该方法生成的大多数查询都与底层的测试数据不相关。作为另一个例子,在美国专利US6,138,112、US6,581,052、US6,826,558和US7,007,007中提出了一种在短时间内随机地生成大量有效SQL语句的方法。但是,该生成是以随机地方式进行的,因此很难控制测试用例的输入和输出。

    第二种方案则通过考虑测试数据来生成查询,但是目前提出的解决方案在实际应用中都存在诸多限制。例如,在N.Bruno,S.Chaudhuri和D.Thomas发表的“Generating Queries with Cardinality Constraints forDBMS Testing”,IEEE Transactions on Knowledge and Data Engineering,2006中提出了一种生成具有行集数约束的查询的方法。但是,该工作却基于查询中的各个谓词彼此相互独立的假设,这在实际应用中是非常罕见的,因而也很难取得理想的结果。

    【发明内容】

    鉴于上述情况,本发明针对与DBMS相关的测试提供一种自动生成数据库查询的方法和系统,其自动生成数据库查询的策略基于具有特定行集数约束的给定查询中的每一个局部谓词的参数实例化。

    根据本发明的一个方面,提供一种生成数据库查询的方法,包括步骤:接收输入查询和行集数约束;以及根据数据库的列组数据相关性对输入查询的局部谓词参数进行实例化,以生成满足行集数约束的候选测试查询。

    优选地,生成测试查询的步骤包括步骤:为输入查询构建有向查询图;对有向查询图进行遍历以构建有向生成树;对有向生成树进行遍历以生成中间结果表;以及根据中间结果表生成满足行集数约束的候选测试查询。

    根据本发明的另一个方面,提供一种生成数据库查询的系统,包括:有向查询图构建器,用于为输入查询构建有向查询图;有向生成树构建器,用于对有向查询图进行遍历以构建有向生成树;矩阵生成器,用于对有向生成树进行遍历以生成中间结果表;以及候选查询生成器,用于根据中间结果表生成满足行集数约束的候选测试查询。

    优选地,按照参照完整性关系为输入查询构建具有根顶点的有向查询图;通过深度优先遍历对有向查询图进行遍历以构建有向生成树;以及通过广度优先搜索对有向生成树进行遍历以生成中间结果表。

    根据本发明的一个优选实施例,生成中间结果表的步骤按照层次顺序对有向生成树进行遍历,并且包括步骤:针对每一层的有向生成树遍历,级联输入查询中局部谓词的参照列作为中间结果表的列组;通过对列组值进行分组从数据库中检索聚合数据信息;以及在中间结果表中保留各列组值均满足行集数约束的列组值并在中间结果表中记录行集数。

    根据本发明的另一个优选实施例,行集数约束c为在可接受范围内的行集数约束c′,并且所述方法还包括根据对所生成的候选测试查询进行评价的步骤,以从中选择一组期望的测试查询。

    此外,根据本发明的一个实施例,局部谓词包括等于谓词、单侧谓词、以及双侧谓词。

    根据本发明的再一个优选实施例,在为输入查询构建的有向查询图为多于一个根顶点的情况下,所述方法还包括步骤:在构建有向查询图之后,标识有向查询图中的接合点和桥接弧;在构建有向生成树之后,通过虚拟弧链接不同有向生成树中的相关顶点,以将构建有向生成树步骤所构建的多个有向生成树转换成有向生成森林;以及在中间结果表生成步骤中分别针对每一个有向生成树生成中间结果,然后将每一个中间结果表看作临时表,将虚拟弧作为有向生成树之间的联接关系,以进一步生成最终的中间结果表。

    根据本发明的另一个优选实施例,查询包括子查询,并且如果子查询为相关子查询,将其去相关为不相关子查询;所述方法在生成候选测试查询之前还包括步骤:从最深层的子查询开始直到最外层子查询,逐层迭代生成中间结果表。

    此外,根据本发明的一个实施例,行集数约束为多个行集数约束,分别用于有向生成树的各层。

    根据本发明的另一个优选实施例,在有向生成树为左深树的情况下,根据查询访问计划的的联接顺序来逐层生成中间结果表。

    根据本发明的自动生成数据库查询的方法和系统,通过考虑目标测试数据库中的数据使得所生成的查询能够满足特定行集数约束,这使得用户能够将行集数约束指定为输入,并由此能够生成期望的测试查询作为用于特定目的测试的输出。

    根据本发明的自动生成数据库查询的方法和系统,利用通过(类似)外键联接的表的数据依赖来构建有向查询图,并且进而生成有向生成森林或者有向生成树。通过遍历有向生成森林或者有向生成树,根据本发明的自动生成数据库的方法和系统能够从目标测试数据库中检索链接的列组的聚合数据信息,从而使得所生成的数据库查询与目标测试数据库的相关性得到加强。

    根据本发明的自动生成数据库查询的方法和系统,在检索聚合数据信息时能够正视列组的数据相关性。也就是说,将(一个表或者一组表)的局部谓词的参照列链接为列组,并且通过按照列组值进行分组来从目标测试数据库中查找数据和检索聚合数据信息。这样,就避免了假设在实际应用中非常罕见的查询的各个谓词彼此相互独立的情况。

    根据本发明的自动生成数据库查询的方法和系统,根据所检索到的聚合数据信息通过对输入查询的局部谓词的参数值进行实例化来自动生成最后的候选查询,由此使得所得到的候选查询与目标测试数据库的相关性得到加强。

    因此,根据本发明的自动生成数据库查询的方法和系统,不仅能够自动生成满足特定行集数约束的查询,而且还通过设置从目标测试数据库中聚合的有意义的数据(值)来替代查询中每一个局部谓词的参数值,使得所得到的查询与目标测试数据库的相关性得到加强。

    另外,本发明还提供用于实现上述自动生成数据库查询的方法的计算机程序。

    此外,本发明也提供至少计算机可读介质形式的计算机程序产品,其上记录有用于实现上述自动生成数据库查询的方法的计算机程序代码。

    【附图说明】

    参照下面结合附图对本发明实施例的说明,会更加容易地理解本发明的以上和其它目的、特点和优点。在附图中,相同的或对应的技术特征或部件将采用相同或对应的附图标记来表示。附图中:

    图1示出根据本发明的自动生成数据库查询的方法和系统的原理示意图;

    图2(a)示出初始查询Q的SQL表示;

    图2(b)示出考虑传递闭包的查询Q+的SQL表示;

    图2(c)示出新生成的查询Q′的SQL表示;

    图3示出根据本发明的自动生成数据库查询的方法的总体流程图;

    图4(a)示出根据本发明的一个实施例的有向查询图GQ;

    图4(b)示出对图4(a)所示的有向查询图GQ进行遍历后生成的有向生成树TQ;

    图4(c)示出图4(b)所示的有向生成树TQ的等价分层树结构TQ;

    图5(a)示出具有多个根顶点的有向查询图;

    图5(b)示出对图5(a)所示的有向查询图进行遍历后生成的有向生成森林;

    图5(c)示出对图5(b)的有向生成森林进行变换后得到的变换后的有向生成森林;

    图6示出用虚拟顶点构成的有向生成树;

    图7示出具有三层子查询的有向生成森林的结构;

    图8示出通过左深树进行的查询访问计划;以及

    图9示出根据本发明的自动生成数据库查询的系统的总体方框图。

    【具体实施方式】

    下面参照附图来说明本发明的实施例。应当注意,为了清楚的目的,附图和说明中省略了与本发明无关的、本领域普通技术人员已知的部件和处理的表示和描述。

    现在参考附图,特别是图1,首先描述本发明所要解决的具体技术问题。在此可以简单地将本发明要解决的问题归纳为生成具有特定行集数约束的查询。

    如图1所示,根据本发明的自动生成数据库查询的方法和系统,将给定的测试数据库D、查询Q、以及用户规定的行集数约束C作为输入,通过找到使得查询满足约束C的参数值由自动查询生成模块按照谓词参数实例化原则生成一组候选查询Q作为输出。所新生成的该组候选查询可以表示为{Q′|每一个Q′均满足约束C}。

    对于一个查询Q,其简单的SQL语句表述如图2(a)所示(在此为了简洁省略了GROUP BY、ORDER BY等子句),示出初始查询的SQL表示,其中S是基表或者聚合列的集合,T1,...,Tn是查询Q的参照表的列表,Ti.L(1≤i≤n)是表Ti的局部谓词集合并且可以表示为析取范式Ti.LGi1=pi1∧...∧Ti.LCik=pik,每一个LCij是局部谓词Ti.LCij=pij的参照列并且pij是相关参数(1≤i≤n,1≤j≤k),J是联接谓词集合。这里使用Ti.LC表示表Ti的局部谓词中的所有参照列的集合,使用Ti.JC表示表Ti的联接谓词中的所有参照列的集合,并且使用Ti.J表示所有表Ti的联接谓词的集合。因此,J=T1.J∪...∪Tn.J。在某些情况下,查询中谓词的参数pij可能不是具体的值,而是参数标记或者主变量,例如局部谓词Ti.LCij=pij可以是Ti.LCij=?或者Ti.LCij=:hv1。

    为了保留联接关系并且避免在处理过程中遗漏可能的联接,需要通过增加逻辑上隐含的联接来针对初始查询Q找到其传递闭包查询Q+。图2(b)是考虑联接的传递所得到的传递闭包查询Q+的的SQL语句表示,其中联接谓词集合J+是联接谓词集合J的传递闭包。

    现在可以将本发明的查询生成策略具体描述为,对于图2(a)和图2(b)分别表示的给定查询Q和其传递闭包Q+,自动生成一组满足约束C的测试查询,新生成的每一个查询Q′的格式类似于图2(c)所示的格式。更具体地说,通过修改每一个表的局部谓词的参数值来生成查询。因此,对于查询Q的每一个表Ti及其初始局部谓词Ti.L,新查询Q′中的新的局部谓词集合Ti.L′被参数化为Ti.LCi1=pi1′∧...∧Ti.LCik=pik′,其中每一个参数值pij′(1≤j≤k)由下面将详细描述的本发明的自动生成数据库查询的方法和系统来赋值。在此将该处理过程称为谓词参数实例化。

    在针对每一个局部谓词进行参数实例化的过程中,与上面提到的N.Bruno,S.Chaudhuri和D.Thomas在“Generating Queries withCardinality Constraints for DBMS Testing”,IEEE Transactions onKnowledge and Data Engineering,2006中假设实际应用中非常罕见的查询中的各个谓词彼此相互独立不同,在本发明的查询生成过程中考虑列的相关性。

    为了便于更加清楚地理解本发明的实质和原理,在下面的描述中将会结合一个具体应用实例来进行说明。该实例为IBM WebSphere Commerce环境下的一个四路联接查询Q,如下所示:

    SELECT ATTRVALUE.SEQUENCE

          ′ATTRIBUTE.USAGE

          ′ATTRIBUTE.DESCRIPTION

          ′ATTRTYPE.OID

          ′CATENTRY.PARTNUMBER

          ′CATENTRY.URL

          ′CATENTRY.CATENTRY_ID

          ′CATENTRY.ONAUCTION

          ′CATENTRY.LASTUPDATE

          ′CATENTRY.MARKFORDELETE

          ′CATENTRY.STARTDATE

          ′CATENTRY.ENDDATE

    FROM ATTRVALUE

        ′ATTRIBUTE

        ′ATTRTYPE

        ′CATENTRY

    WHERE ATTRVALUE.STRINGVALUE=?

      AND ATTRVALUE.NAME=?

      AND ATTRIBUTE.QTYUNIT_ID=?

      AND ATTRTYPE.DESCRIPTION=?

     AND CATENTRY.FIELD4=?

     AND ATTRVALUE.ATTRIBUTE_ID=

                    ATTRIBUTE.ATTRIBUTE_ID

         AND ATTRVALUE.ATTRTYPE_ID=

                    ATTRTYPE.ATTRTYPE_ID

         AND ATTRVALUE.CATENTRY_ID=

                    CATENTRY.CATENTRY_ID

         AND ATTRIBUTE.CATENTRY_ID=

                    CATENTRY.CATENTRY_ID;

    为了使问题更加清楚简洁并突出本发明的核心原理,利用下表1所示的符号解释映射将上述查询Q进行符号化表示。

    表1符号解释映射表

      符号  查询元素  T1  ATTRVALUE  T2  ATTRIBUTE  T3  ATTRTYPE  T4  CATENTRY  T1.C1  ATTRVALUE.STRINGVALUE  T1.C8  ATTRVALUE.NAME  T2.C5  ATTRIBUTE.QTYUNIT_ID  T3.C6  ATTRIBUTE.QTYUNIT_ID  T4.C7  CATENTRY.FIELD4  T1.C2  ATTRVALUE.ATTRIBUTE_ID  T1.C3  ATTRVALUE.ATTRTYPE_ID  T1.C4  ATTRVALUE.CATENTRY_ID  T2.C2  ATTRIBUTE.ATTRIBUTE_ID  T2.C4  ATTRIBUTE.CATENTRY_ID  T3.C3  ATTRTYPE.ATTRTYPE_ID  T4.C4  CATENTRY.CATENTRY_ID  S  ATTRVALUE.SEQUENCE  ′ATTRIBUTE.USAGE  ′ATTRIBUTE.DESCRIPTION  ′ATTRTYPE.OID  ′CATENTRY.PARTNUMBER  ′CATENTRY.URL  ′CATENTRY.CATENTRY_ID  ′CATENTRY.ONAUCTION  ′CATENTRY.LASTUPDATE  ′CATENTRY.MARKFORDELETE  ′CATENTRY.STARTDATE  ′CATENTRY.ENDDATE

    按照上表1的符号解释,对上述查询Q进行符号化后的SQL语句表示如下所示:

    SELECT S

    FROM  T1,T2,T3,T4

    WHERE T1.C1=?AND

          T1.C8=?AND

          T2.C5=?AND

    T3.C6=?AND

    T4.C7=?AND

    T1.C2=T2.C2 AND

    T1.C3=T3.C3 AND

    T1.C4=T4.C4 AND

    T2.C4=T4.C4;

    相应地,其传递闭包查询Q+的SQL语句表示如下所示:

    SELECT S

    FROM  T1,T2,T3,T4

    WHERE T1.C1=?AND

          T1.C8=?AND

          T2.C5=?AND

          T3.C6=?AND

          T4.C7=?AND

          T1.C2=T2.C2 AND

          T1.C4=T2.C4 AND<--传递

          T1.C3=T3.C3 AND

          T1.C4=T4.C4 AND

          T2.C4=T4.C4;

    这里,用符号表示通过传递闭包增加的联接谓词。

    至此,经过上述简化处理之后,问题变为针对查询Q如何生成一组满足用户规定的行集数约束C的新查询Q′,即将上述查询中谓词参数“?”进行实例化处理后生成候选查询Q′。

    下面将结合附图并针对上述实例详细说明本发明的自动生成数据库查询的方法和系统。参考图3,示出根据本发明的自动生成数据库查询的方法的总体流程图。

    如图3所示,首先在步骤S31中,通过考虑(类似)参照完整性关系为给定查询Q生成有向查询图GQ。

    对于查询Q,假定GQ=<VQ,AQ>是其顶点标注的有向图,其中VQ是顶点集合,每一个顶点代表查询Q所参照的一个表,AQ是弧集合{<Tu,Tv>|Tu,Tv∈VQ∧Tu≠Tv},每一个弧代表基于参照完整性的顶点Tu和Tv之间的联接关系。第一个坐标Tu表示子表或者细目表,而第二个坐标Tv表示父表或者主表。在此假定在父和子属性之间总是存在联接关系以反映参照完整性关系。弧的方向则暗示了子属性和父属性之间的依赖关系。也就是说,父属性决定了其子属性,并且由此子属性的每一个值总是能够唯一地在父表中找到。在某些情况下,各个表通过类似外键联接,例如一对一联接。作为另一个例子,表的属性的值为另一个表的联接属性的值的子集或超集(superset)。所有这些联接都可以在通过本发明的有向查询图来表示。

    通常,有向图GQ中的顶点Tu通过(k+1+m)元组(lc1,...,lck,jc0,jc1,...,jcm)来标注,其中元素jc0表示Tu的联接父属性(列),每一个元素jcp(1≤p≤m)表示联接子属性(列)中的一个,以及每一个元素lci(1≤i≤k)表示Tu的局部谓词的一个中的列。在此,通过将父属性加星号(*)以及将局部谓词的列加下划线(_)而将上述(k+1+m)元组(lc1,...,lck,jc0,jc1,...,jcm)表示为(lc1,...,lck,jc0*,jc1,...,jcm),以便在查询图中清楚地区分这三种表中的列。

    图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则是联接子属性(列)。

    应该指出的是,在有向查询图GQ中,如果一个顶点Tr的入度id(Tr)为0,则将该顶点Tr称为图GQ的根顶点。对于根顶点Tr,其标注的元组总是(lc1,...,lck,jc1,...,jcm),表明表Tr没有被参照的父属性,因此不会有jc0。在上面所示的实例中,T1是根顶点。

    另外,对于一个顶点Tf,如果其出度od(Tf)为0,则其标注的元组总是(lc1,...,lck,jc0*),这表明表Tf没有子属性,因此缺少jc1,...,和jcm。在上面所示的实例中,T3和T4是这一类型的顶点。

    在步骤S31中构建了有向查询图GQ之后,处理流程前进到步骤S32,在此通过遍历查询图GQ构建有向生成树TQ。

    在该步骤S32中,根据本发明的一个实施例,通过深度优先遍历(DFS,Depth First Search)来遍历在步骤S31中生成的有向查询图GQ,以便生成有根的有向生成树TQ。

    根据本发明的一个实施例,用于遍历有向查询图GQ的深度优先遍历的算法如下所示:

    深度优先遍历算法

    输入:有向查询图GQ和顶点Tv

    输出:有向树T

    dfs(GQ,Tv){

      visit(Tv);

      add Tv to tree T;

       for each successor Tw of Tv do

         if Tw is unvisited{

            dfs(GQ,Tw);

            add arc<Tv,Tw>to tree T;

         }

      return T;

    }

    根据本发明的一个实施例,用于生成有向生成树TQ的算法如下所示:

    构建有向生成树算法

    输入:有向查询图GQ及其根顶点Tr

    输出:有根的有向生成树(森林)TQ

    constructSpanningTree(GQ,Tr){

      tree TQ=dfs(GQ,Tr);

      return TQ;

    }

    按照上面所述的深度优先遍历算法dfs{ }和构建有向生成树算法constructSpanningTree{ }对图4(a)所示的有向查询图GQ进行遍历后生成的有向生成树TQ如图4(b)所示。图4(c)为图4(b)的等价表示,对图4(b)所示的有向生成树TQ进行了调整,以便形成常用的分层树结构。

    在步骤S32中通过遍历查询图GQ构建了有向生成树TQ之后,处理流程前进到步骤S33,在此通过广度优先搜索(BFS,Breadth First Search)遍历有向生成树TQ,以便迭代生成中间结果M。

    上面所提到的谓词参数实例化也主要在这一步骤中完成。针对每一层树遍历构建临时表M,以便级联查询中局部谓词(根据树的层次顺序可能为一个表的局部谓词,也可能为一组表的局部谓词)的参照列作为临时表M的列组,然后构造相关的SQL语句,以便从目标测试数据库中查找数据并且通过对列组值进行分组来检索聚合数据信息。

    下面首先针对单个表来讨论如何构建上述中间临时表M,然后将其扩展到一般情况下的多个表。

    首先,考虑查询Q中的表T,具有k个局部谓词T.LC1=p1∧...T.LCk=pk的情况,其中T.LCi是表T的列并且pi为相应的参数,1≤i≤k。现在模拟n×(k+1)矩阵表M,如表2所示,其中n是满足指定行集数约束C的列组(T.LC1,...,T.LCk)的相异值的数量。这里,将特征值M[vh1,...,vhk,cardh](1≤h≤n)定义为列组(T.LC1,...,T.LCk)的一个数据组,并且这意味着在选择第h元组中的值来生成测试查询时,每一个pi将被实例化为vhi(1≤i≤k)。因此,表T的局部谓词被精确地参数化为T.LC1=vh1∧...∧T.LCk=vhk。值cardh是列组的(T.LC1,...,T.LCk)数据组中的第h个最大的行集数。

    考虑用户所指定的行集数约束C(这里为了简洁起见先考虑单个行集数约束c的情况,对于多个行集数约束的情况将在下文中详细描述),仅在中间表M中保留满足条件cardj≥c(1≤j≤n)的元组,而将表T的其他元组丢弃。

    表2中间结果表/矩阵M

      #1...  #i......  #k  #(k+1)  T.LC1...  T.LCi......  T.LCk  CARD  v11  v21  ...  vh1  ...  ...  vn1.....................  v1i  v2i  ...  vhi  ...  ...  vni..........................................  v1k  v2k  ...  vhk  ...  ...  vnk  card1  card2  ...  cardh  ...  ...  cardn

    上述针对表T的矩阵M可以通过下面的SQL语句来检索所有符合要求的记录并构建:

    SELECT M.LC,M.CARD

    FROM(

      SELECT T.LC,COUNT(*)AS CARD

      FROM  T

      WHERE 1=1

      GROUP BY T.LC HAVING COUNT(*)>=C

      ORDER BY CARD DESC  )AS M;

    这样,可以将所构建的矩阵M看作临时表,其中n×(k+1)矩阵M是一个具有(k+1)自由度并且M的行集数为n的表。在此,用M.LC表示M的局部谓词中的列集合(在单个表的情况下,M.LC等于T.LC),用M.L表示M的局部谓词的集合,用M.JC表示M的联接谓词的列集合。对于单个表的情况,M.JC等于等于传递闭包联接谓词集合T.JC+。实际上,并不将联接的列构建到中间结果M中,在这里定义列集合M.JC仅仅用于保存所有联接的列的信息。

    下面将把上面针对单个表的情况推广到更为一般的情形。现在考虑将n×(k+1)矩阵M1作为现有的中间结果表以及另外还有一组表比如三个表Tα、Tβ、和Tγ的情况。

    对于每一个元组M1[vh1,...,vhk,cardh](1≤h≤n),构建下面的查询,其中每一个局部谓词M1.LCi=pi的参数pi已经用值vhi进行了实例化。

    SELECT M.LC,M.CARD

    FROM(

    SELECT M1.LC,Tα.LC,Tβ.LC,Tγ.LC,

     COUNT(*)  AS CARD

      FROM  M1,Tα,Tβ,Tγ

      WHERE  1=1 AND

             M1.LC1=v11 AND

             ...

             M1.LCk=v1k AND

             M1.J

     GROUP BY M1.LC,Tα.LC,Tβ.LC,Tγ.LC

      HAVING COUNT(*)>=C

       ORDER BY CARD DESC  //第一元组

     UNION

     ...

     UNION

     SELECT M1.LC,Tα.LC,Tβ.LC,Tγ.LC,

      COUNT(*)  AS CARD

       FROM  M1,Tα,Tβ,Tγ

       WHERE 1=1 AND

             M1.LC1=vh1 AND

             ...

             M1.LCk=vhk AND

             M1.J

     GROUP BY M1.LC,Tα.LC,Tβ.LC,Tγ.LC

      HAVING COUNT(*)>=C

       ORDER BY CARD DESC  //第h元组

     UNION

     ...

     UNION

     SELECT M1.LC,Tα.LC,Tβ.LC,Tγ.LC,

      COUNT(*)  AS CARD

       FROM M1,Tα,Tβ,Tγ

       WHERE 1=1 AND

             M1.LC1=vn1 AND

             ...

             M1.LCk=vnk AND

             M1.J

     GROUP BY M1.LC,Tα.LC,Tβ.LC,Tγ.LC

      HAVING COUNT(*)>=C

       ORDER BY CARD DESC  //第n元组

    )AS M;

    根据该构造的查询所得到的结果将形成(k+|Tα·LC|+|Tβ·LC|+|Tγ·LC|+1)维矩阵,该矩阵的行集数将由上述查询的合格的行的数量确定。M的局部谓词的列集合M.LC为M1.LC∪ Tα·LC∪Tβ·LC∪Tγ·LC,局部谓词集合M.L为M1.L∪ Tα·L∪Tβ·L∪Tγ·L,而联接谓词的列集合M.JC为M1.JC∪Tα·JC+∪Tβ·JC+∪Tγ·JC+。

    根据本发明的一个实施例,将上述操作归结为生成中间结果矩阵的方法,称作genMatrix()。该方法具有三个输入参数,中间结果表Min、一组表{T1,...,Tn}、以及用户指定的行集数约束c,而该方法将返回新的中间结果Mout作为输出。实际上,该方法将根据输入条件构建查询,以便从数据库中检索相关列组的聚合数据信息。对于单个表格T,更具体地说,该方法将实施为调用genMatrix(Φ,T,c),以便检索其中间结果。

    总上所述可以看出,在这一步骤S33中,将有向查询图的有向生成树作为输入,按照层次顺序(BFS)来遍历该有向生成树,并且在每一层的处理期间迭代调用genMatrix(),以便生成中间结果表M。

    还应该指出的是,可以允许行集数约束为一定的可接受的范围,而不一定必须如上面所描述的为一个精确的数目。在行集数约束c和指定的绝对偏差d(d≥0)的情况下,允许最终的行集数c′的大小可以在[c-d,c+d](c-d≤c′≤c+d)的范围内。这样,在最后一次调用genMatrix()时,在相应构建的查询中的HAVING子句将被修改为HAVING COUNT(*)BETWEEN(c-d)AND(c+d)。当然,用户也可以自己指定合格的行集数c′为[c,c+d](c≤c′≤c+d)。

    下面将结合上文中给出的具体实例更进一步地详细说明步骤S33中的处理。这里将图4(c)的有向生成树作为输入,并且假定行集数约束c为1000,偏差d为100,并且希望最后得到的行集数范围为[1000,1100]。在该基础上,将按照以下各层次的遍历通过调用genMatrix()来生成满足行集数约束的最终中间结果M。

    第一层次遍历,通过调用genMatrix(Φ,T1,1000)生成如下表3所示的中间结果M1。

    表3 M1(T1)

        T1.C1    T1.C8  CARD    Brown    Minor  143139    Black    Major  123136    Red    Major  79686

        Green    Major    56229    Blue    Major    23998    Violet    Minor    9328    White    Major    1816    Yellow    Major    1386

    第一层次遍历相关的SQL语句可以如下构建:

    SELECT M1.LC,M1.CARD

    FROM(

      SELECT  T1.C1,T1.C8,COUNT(*) AS CARD

      FROM  T1

      WHERE 1=1

      GROUP BY T1.C1,T1.C8

             HAVING COUNT(*)>=1000

     ORDER BY CARD DESC) AS M1;

    第二层次遍历,通过调用genMatrix(M1,{T2,T3},1000)生成如下表4所示的中间结果M2。

    表4 M2(T1,T2,T3)

      T1.C1  T1.C8  T2.C5 T3.C6    CARD Brown  Minor  2020 Alabama    2056 Brown  Minor  2020 Maine    1560 Brown  Minor  2020 Arizona    1260 Black  Major  1098 NewYork    2105 Black  Major  4648 Utah    1325 Black  Major  1098 California    1309 Red  Major  4648 California    1207 Green  Major  1354 New Jersey    1022

    第二层次遍历相关的SQL语句可以如下构建(为了简洁起见仅仅示出了部分SQL语句):

     SELECT M2.LC,M2.CARD

     FROM(

       SELECT T1.C1,T1.C8,T2.C5,T3.C6,

             COUNT(*) AS CARD

       FROM  T1,T2,T3

       WHERE 1=1  AND

             T1.C1=′Brown′AND

             T1.C8=′Minor′AND

             T1.C2=T2.C2 AND

             T1.C4=T2.C4 AND

             T1.C3=T3.C3

      GROUP BY T1.C1,T1.C8,T2.C5,T3.C6

           HAVING COUNT(*)>=1000

      ORDER BY CARD DESC

     UNION

     ...

     UNION

      SELECT T1.C1,T1.C8,T2.C5,T3.C6,

            COUNT(*) AS CARD

    FROM  T1,T2,T3

    WHERE 1=1AND

          T1.C1=′Yellow′AND

          T1.C8=′Major′AND

          T1.C2=T2.C2AND

          T1.C4=T2.C4AND

          T1.C3=T3.C3

    GROUP BY T1.C1,T1.C8,T2.C5,T3.C6

         HAVING COUNT(*)>=1000

    ORDER BY CARD DESC)AS M2;

    第三层次遍历,通过调用genMatrix(M2,T4,[1000,1100])生成如下表5所示的中间结果M3。

    表5 M3(T1,T2,T3,T4,最终结果)

      T1.C1  T1.C8  T2.C5  T3.C6  T4.C7  CARD  Brown  Minor  2020  Alabama  DK  1056  Brown  Minor  2020  Maine  MV  1030  Brown  Minor  2020  Alabama  KM  1000  Black  Major  1098  California  WW  1100  Black  Major  1098  New York  WD  1100  Black  Major  1098  New York  DH  1005

    第三层次遍历相关的SQL语句可以如下构建(为了简洁起见仅仅示出了部分SQL语句):

    SELECT M3.LC,M3.CARD

    FROM(

      SELECT T1.C1,T1.C8,T2.C5,T3.C6,

             T4.C7,COUNT(*)AS CARD

      FROM   T1,T2,T3,T4

      WHERE  1=1 AND

             T1.C1=′Brown′AND

             T1.C8=′Minor′AND

             T2.C5=2020 AND

             T3.C6=′Alabama′AND

             T2.C4=T4.C4

      GROUP BY  T1.C1,T1.C8,T2.C5,T3.C6,

           T4.C7 HAVING COUNT(*)BETWEEN

                        1000 AND 1100

      ORDER BY CARD DESC

     UNION

     ...

     UNION

      SELECT T1.C1,T1.C8,T2.C5,T3.C6,

             T4.C7,COUNT(*)AS CARD

      FROM   T1,T2,T3,T4

      WHERE  1=1 AND

             T1.C1=′Green′AND

             T1.C8=′Major′AND

             T2.C5=1354 AND

             T3.C6=′New Jersey′AND

           T2.C4=T4.C4

    GROUP BY T1.C1,T1.C8,T2.C5,T3.C6,

          T4.C7 HAVING COUNT(*)BETWEEN

                       1000 AND 1100

    ORDER BY CARD DESC) AS M3;

    现在回到图3,在步骤S33中生成中间结果M之后,处理流程前进到步骤S34,判断是否遍历了所有的顶点。如果没有遍历所有顶点,则返回步骤S33,继续遍历有向生成树TQ,直到遍历完所有的顶点。

    如果在步骤S34中判断遍历了所有的顶点,并且生成了满足最终行集数约束c′的最终中间结果M,则处理流程前进到步骤S35,根据最终中间结果M生成候选测试查询Q′。这样,对于n路联接查询Q和行集数约束c,能够检索使得Q满足c的列组(T1.LC,...,Tn.LC)的所有合格元组。相应地,根据最终中间结果M通过实例化每一个参数值即能够自动地生成候选测试查询Q′。

    另外,在此定义相对偏差作为测试用例的评价因子,其中(如果c或c′为0,则任意地将其用1替代)。用户能够根据相对偏差方便地从所生成的候选测试用例中选择一组子集合查询作为所期望的最后结果。

    对于上文中提到的具体实例,在这一步骤S35中根据表5所示的最终中间结果M3可以得到如下表6所示的候选测试查询Q′。

    表6候选测试查询

    应该指出的是,在上面所讨论的实例中以每一个表的局部谓词均为具有“等于”谓词的析取范式为例进行了描述,即T.LC1=p1∧...∧T.LCk=pk。但是,本发明不仅限于此,而是包括各种形式的谓词,比如单侧谓词(例如T.LC1≤p1或T.LC1≥p1)、以及双侧谓词(例如T.LC1 BETWEEN p1 ANDp2或p1≤T.LC1≤p2)。

    对于这种情况,需要对上面描述的方法genMatrix()进行修改以便支持范围谓词。下面以具有单个表T、两个单侧范围谓词、以及行集数约束c(为了简洁起见没有设置偏差)的查询Q为例进行说明,其局部谓词集合T.L表示为T.LC1=p1∧...∧T.LCk-2=pk-2∧T.LCk-1≤pk-1∧T.LCk≥pk。首先,构建下面所示的SQL语句以便从数据库中检索聚合信息。

    SELECT T.LC1,

           ...

           T.LCk-2,

           T.LCk-1,

           T.LCk,

           COUNT(*)AS CARD

    FROM  T

    WHERE 1=1

    GROUP BY T.LC1,

             ...

             T.LCk-2,

             T.LCk-1,

             T.LCk

    ORDER BY T.LC1,

             ...

             T.LCk-2,

             T.LCk-1   ASC,

             T.LCk  DESC,

             CARD      ASC ;

    对于该SQL语句的结果,可以将其看作临时的n×(k+1)矩阵MT。考虑矩阵MT中的如下y×(k+1)矩形区域RT:对于矩阵MT中的每一个值mip和mjp(1≤i≤y,1≤j≤y,i≠j,1≤p≤k-2)总有mip=mjp,对于矩阵MT中的每一个值mi(k-1)和mj(k-1)(1≤i≤j≤y)总有mi(k-1)≤mj(k-1),以及对于矩阵MT中的每一个值mik和mjk(1≤i≤j≤y),如果mi(k-1)=mj(k-1)则总有mik≥mjk。

    下面的表7示出了一个这样的矩形区域,例如,T.LC1的所有值等于a,T.LC2的所有值等于b,T.LCk-2的所有值等于z,T.LCk-1的所有值具有单调特性,当si≤sj时usi≤usj,以及在usi=usj的条件下T.LCk的所有值具有单调特性,当si≤sj时vsi≥vsj。

    表7矩形区域RT

    针对该矩形区域RT,通过使用函数

    将第(k+1)列(列CARD)的值计算为sy×1矢量Asubsum(cardsl)...subsum(cardsi)...subsum(cardsy),]]>然后用该矢量A替换矩阵区域RT的第(k+1)列的原始值,如下面的表8所示。

    表8替换后的矩形区域RT

    在该修正后的矩形区域中,丢弃了subsum(cardsi)<c的元组以便形成新的矩形区域RS。因此,可以推断当将局部谓词实例化为RS的第si行k元组RS[a,b,...,z,usi,vsi]时,subsum(cardsi)的值能够更准确地等于最终的行集数约束c′。针对初始查询Q所生成的相关候选查询Q′如下所示,其实际的约束c′大于行集数约束c(Q′满足c)。

    SELECT S

    FROM  T

    WHERE T.LC1=a AND

          T.LC2=b AND

          ...

          T.LCk-2=z  AND

          T.LCk-1≤usi AND

          T.LCk≥vsi;

    在整个矩阵MT中,genMatrix()方法将查找所有这种类型的矩形区域,针对每一个这样的区域分别调用subsum()函数,并且丢弃不合格的元组,最后联合所有剩余的元组以生成新的矩阵MS作为最终结果。

    对于其他的双侧范围谓词和多个表查询的情况,也可以根据类似的原理修改genMatrix()来生成最终的中间结果矩阵。

    另外,在某些情况下,在步骤S31中生成的有向查询图中可能存在多于一个的根顶点。图5(a)示出违背一个根顶点期望的10路联接有向查询图。当使用多个根对有向查询图进行遍历时,将构建有向生成森林,其包括一组断开的有根的有向生成树来替代单个有向生成树。有向生成森林中的有向生成树的数量通常由有向查询图中的根顶点的数量来决定。例如,对于图5(a)所示的有向查询图,在构建的有向生成森林中存在两个有向生成树,如图5(b)所示。从该示例中可以看出,在针对多个根顶点的有向查询图生成有向生成森林后,可能会丢失某些潜在的联接关系。因此,针对这种情况,必须对图3所示的方法进行改进以涵盖这种情况。

    首先,在步骤S31之后增加子步骤S31+,以便标识有向查询图中的接合点和桥接弧。通常情况下,接合点(也称作切割顶点)和桥接边是无向图中的概念,用来表示图的连通特征。在本发明的实施例中,将这些概念借用到有向图中来说明本发明。在有向查询图中GQ,考虑三个顶点Tu、Tv和Tw,如果存在两个弧<Tu,Tw>和<Tv,Tw>,并且Tw的入度id(Tw)≥2,但是从Tu到Tv或者从Tv到Tu没有路径,则将顶点Tw定义为接合点,并且将Tw添加到接合点集合NQ⊆VQ.]]>同时,在此将弧<Tu,Tw>和<Tv,Tw>称作桥接弧并将他们添加到桥接弧集合BQ={<Ti,Tj>|Ti∈VQ∧Tj∈NQ∧Ti≠Tj}。在图5(a)所示的示例中,NQ={T2}并且BQ={<T0,T2>,<T1,T2>,<T6,T2>,<T3,T2>}。

    然后在步骤S32中,通过有向查询图GQ中的每一个根顶点遍历有向查询图GQ来构建有向生成森林FQ。在此简要描述根据本发明一个实施例的构建有向生成树的方法。针对图5(a)所示的有向查询图,在构建了如图5(b)所示的有向生成森林FQ之后,T0和T2在一棵有向生成树上,而T1、T3和T6在另一棵有向生成树上,在所生成的有向生成森林中这两棵树相互断开。因此,在步骤S32的构建有向生成森林的过程中丢失了他们的联接关系。为了准确地保留这些联接关系,需要增加子步骤S32+,以便通过连接不同有向生成树中的相关顶点来将在步骤S32中构建的有向生成森林转换成新的有向生成森林。在此通过一类特殊的弧,即“虚拟弧”来链接所有的这些联接关系,在有向生成森林中用虚线弧表示。如图5(c)所示,在该示例中,经过有向生成森林变换之后的虚拟弧为用虚线表示的弧{<T1,T2>,<T6,T2>,<T3,T2>}。进行有向生成森林变换的算法如下所示。

    “构建有向生成森林算法”

    输入:有向查询图GQ及其根顶点集合RQ

    输出:包括一个或多个有根的有向生成树TQ的有向生成森林FQ

    constructSpanningForest(GQ,RQ){

      forest FQ=Φ;

      for each root vertex r∈RQ do

        tree TQ=dfs(GQ,r);

        FQ=FQ∪TQ;

      return FQ;

    }

    “变换有向生成森林算法”

    输入:有向生成森林FQ及桥接弧集合BQ

    输出:变换后的有向生成森林FQ’及新的桥接弧集合BQ’

      transformSpanningForest(FQ,BQ){

        for each arc<i,j>∈BQ do

        if arc<i,j>exists in any of spanning tree TQR

           BQ=BQ-<i,j>;//remove arc<i,j>from BQ

        if vertex i∈spanning tree TQR and vertex j∈spanning tree TQS(i≠j∧TQR≠TQS)

           FQ=FQ∪<i,j>;//add virtual arc<i,j>to FQ

        return(FQ,BQ);

    }

    最后,在步骤S33中分别针对每一个有向生成树生成中间结果,然后可以将每一个中间结果看作临时表,而虚拟弧则表示有向生成树之间的联接关系。这样,将每一个中间结果作为一个虚拟顶点,如图6所示,然后迭代调用genMatrix()直到遍历了有向生成树中的所有虚拟顶点为止。

    此外,还应该指出的是,在前面的实施例中是以没有子查询的查询为例进行说明的。但是,本发明不仅限于此,而是也可以应用到具有子查询的查询中。虽然对于大多数具有子查询的情况只关注其某一类特定的子查询而不是整个查询,由此可以应用上面所述的方法针对该类特定的子查询构建满足行集数约束的候选查询,但是,本发明也可以针对一般的查询级别而不是特定的子查询来构建满足行集数约束的候选查询。

    对于包含不相关子查询的查询,可以从最深层的子查询开始,构建该子查询的有向查询图、构建其有向生成树、以及调用genMatrix(),以便针对该子查询生成中间结果。然后,将该中间结果作为虚拟顶点,并通过在有向生成森林中添加虚拟弧来处理其上一层子查询。这样,可以从最深层的子查询开始迭代处理所有层次的子查询。图7示出了处理多层次子查询的一个示例。

    对于包含相关子查询的查询,可以首先将这些相关的子查询去相关,将他们变为不相关的子查询,然后再应用本发明的上述方法即可。关于相关子查询的去相关方法,请参见美国专利US5,548,755、Praveen Seshadri,Hamid Pirahesh,T.Y.Cliff Leung的“Complex Query Decorrelation”,InProceedings of 12th International Conference on Data Engineering(ICDE1996),1996、以及P.Seshadri,J.M.Hellerstein,H.Pirahesh,T.Y.CliffLeung,R.Ramakrishnan,D.Srivastava,P.J.Stuckey,S.Sudarshan的“Cost-based optimization for magic:algebra and implementation”,InACM SIGMOD Record,1996等有关文献,在此略去其详细说明。

    另外还应该指出的是,可以将上文中描述的单个行集数约束c扩展到多个行集数约束,这里用行集数集合C表示。考虑具有l层的有向生成树TQ,可以制定多个行集数约束C={c1,...,cl}。每一个行集数约束ci(1≤i≤l)用于在树遍历期间控制第i次调用genMatrix()时的中间结果的大小。例如,对于图4(c)中的有向生成树,在遍历期间可以将行集数约束规定为C={cQ1,cQ2,cQ3}。更具体地,可以将单个行集数约束看作多个行集数约束的特例,只不过每一个行集数约束ci彼此均相等而已。相应地,对于具有r个有向生成树、每一个树TQk(1≤k≤r)具有kl层的有向生成森林FQ,则可以指定行集数约束C为{c11,...,c1l,...,ck1,...,ckl,...,cr1,...,crl,c1,...,cr-1}。例如,对于图5(b)所示的示例,可以指定行集数约束集合为C={cR1,cR2,cR3,cS1,cS2,cS3,cS4,c1}。

    以这种方式,可以提供灵活的方式通过指定多个行集数约束来控制每一个中间结果的大小。

    此外,还应该注意的是,查询访问计划通常都图形化为左深树,如图8所示。在这种情况下,根据本发明的一个实施例,调用genMatrix()的顺序则是根据访问计划的联接顺序来进行,而不是按照上面所述的层次顺序来进行遍历。以图8所示的实例为例,其联接顺序为T1->T2->T3,在此指定行集数约束C={c1,c2,c3,c4,c5}来控制每一个中间结果的大小。

    按照访问计划的联接顺序,对于图8所示的左深树,genMatrix()首先构建下述SQL语句,以便针对表T1生成如表9所示的满足行集数约束c1的中间矩阵M1。

    SELECT M1.LC,M1.CARD

    FROM(

      SELECT T1.LC11,COUNT(*) AS CARD

      FROM  T1

      WHERE 1=1

      GROUP BY T1.LC11  HAVING COUNT(*)>=C1

      ORDER BY CARD DESC) AS M1;

    表9 M1(T1)

    T1.LC11 CARDu1 cardu1... ...ux cardux

    接着,genMatrix()联接中间结果M1和表T2以生成如表10所示的满足行集数约束c2的中间结果M2,其相应的SQL语句如下所示。

    SELECT M2.LC,M2.CARD

    FROM(

      SELECT T1.LC11,T2.LC21,

             COUNT(*) AS CARD

      FROM  T1,T2

      WHERE 1=1 AND

            T1.LC11=u1

            T1.JC12=T2.JC22

      GROUP BY T1.LC11,T2.LC21

               HAVING COUNT(*)>=C2

      ORDER BY CARD DESC  //u1

     UNION

     ...

     UNION

      SELECT T1.LC11,T2.LC21,

             COUNT(*) AS CARD

     FROM  T1,T2

     WHERE 1=1 AND

           T1.LC11=ux

           T1.JC12=T2.JC22

     GROUP BY T1.LC11,T2.LC21

              HAVING COUNT(*)>=C2

     ORDER BY CARD DESC  //ux

    )AS M2;

    表10 M2(T1,T2)

    T1.LC11 T2.LC21 CARD u1 v1 carduv1 ... ... ...

    uyvycarduvy

    然后,genMatrix()通过将T2.LC21用中间结果M2中的值进行实例化来针对表T2构建下述SQL语句,以便生成满足行集数约束c3的中间结果M3,如表11所示。

    SELECT M3.LC,M3.CARD

    FROM(

      SELECT T2.LC21,COUNT(*) AS CARD

      FROM   T2

      WHERE  T2.LC21=v1

      GROUP BY T2.LC21 HAVING COUNT(*)>=C3

      ORDER BY CARD DESC  //v1

     UNION

     ...

     UNION

      SELECT T2.LC21,COUNT(*) AS CARD

      FROM   T2

      WHERE  T2.LC21=vy

      GROUP BY T2.LC21 HAVING COUNT(*)>=C3

      ORDER BY CARD DESC  //vy

    ) AS M3;

    表11 M3(T2)

      T2.LC21    CARD    v1    cardv1    ...    ...    vz    cardvz

    在联接表T1和T2期间为了满足行集数约束c3,需要丢弃中间结果矩阵M2中T2.LC21 vi的值矩阵M3中T2.LC21 vj的任意值的元组。由此,可以得到删减后的中间结果M2′,如下表12所示。

    表12 M2′(T1,T2)

        T1.LC11    T2.LC21    CARD    u1′    v1′    carduv1′    ...    ...    ...    uz′    vz′    carduvz′

    类似的,使用中间结果M2′联接表T3,以便使结果满足行集数约束c4并生成新的中间结果M4,如表13所示。相应的SQL语句如下所示:

    SELECT M4.LC,M4.CARD

    FROM(

      SELECT T1.LC11,T2.LC21,T3.LC31,

             T3.LC32,COUNT(*) AS CARD

      FROM   T1,T2,T3

      WHERE  1=1 AND

             T1.LC11=u1′  AND

             T2.LC21=v1′

      GROUP BY T1.LC11,T2.LC21,T3.LC31,

              T3.LC32 HAVING COUNT(*)>=C4

      ORDER BY CARD DESC       //uv1′

     UNION

     ...

     UNION

      SELECT T1.LC11,T2.LC21,T3.LC31,

            T3.LC32,COUNT(*) AS CARD

      FROM  T1,T2,T3

      WHERE 1=1 AND

            T1.LC11=uz′AND

            T2.LC21=vz′

      GROUP BY T1.LC11,T2.LC21,T3.LC31,

              T3.LC32 HAVING COUNT(*)>=C4

      ORDER BY CARD DESC        //uvz′

    ) AS M4;

    表13 M4(T1,T2,T3)

     T1.LC11 T2.LC21 T3.LC31 T3.LC32 CARD u1″ v1″ ω1 υ1 carduvωυ1 ......... ... ... uw″ vw″ ωw υw carduvωυw

    为了满足行集数约束c5,genMatrix()使用中间结果M4中的值实例化列组(T3.LC31,T3.LC32),从而针对表T3构建下述SQL语句,以便生成新的中间结果M5。

    SELECT M5.LC,M5.CARD

    FROM(

      SELECT T3.LC31,T3.LC32,

            COUNT(*) AS CARD

      FROM  T3

      WHERE T3.LC31=ω1 AND

            T3.LC32=u1

      GROUP BY T3.LC31,T3.LC32

               HAVING COUNT(*)>=C5

      ORDER BY CARD DESC         //(ω1,u1)

     UNION

     ...

     UNION

      SELECT T3.LC31,T3.LC32,

            COUNT(*)AS CARD

      FROM  T3

      WHERE T3.LC31=ωw AND

            T3.LC32=uw

      GROUP BY T3.LC31,T3.LC32

               HAVING COUNT(*)>=C5

      ORDER BY CARD DESC          //(ωw,uw)

    ) AS M5;

    最后,丢弃中间结果M4中列组(T3.LC31,T3.LC32)(ωi,υi)的值中间结果矩阵M5中列组(T3.LC31,T3.LC32)(ωj,υj)的任意值的元组,以便获得删减的最终中间结果M4′。可以看出,使用该中间结果M4′进行谓词参数实例化能够满足行集数约束集合C={c1,c2,c3,c4,c5}的要求。

    以上结合附图详细描述了实现本发明的自动生成数据库查询的方法的各个具体实施方式,下面将结合图9描述本发明的自动生成数据库查询的系统。

    如图9所示,根据本发明的一个实施例的自动生成数据库查询的系统主要包括查询图生成模块910、查询生成模块920、以及测试用例生成模块930。

    查询图生成模块910用于对输入的查询Q进行分析,以便生成其有向查询图和有向生成树。查询图生成模块910主要包括:有向查询图构建器912,用于对输入的查询Q构建有向查询图;有向生成树/森林构建器914,用于根据有向查询图构建器所构建的有向查询图构建有向生成树,或者构建有向生成森林并对其进行转换;图形可视化器916,用于对有向查询图构建器912构建的有向查询图和有向生成树/森林构建器914构建及转换的有向生成树/森林进行可视化显示;以及图形可视化器用户接口918,用于实现与用户的交互。

    查询生成模块920用于对查询图生成模块910所生成的有向生成树/森林进行遍历以便生成满足行集数约束条件的候选测试查询。查询生成模块920主要包括:符号化查询表示器922,用于将输入查询转化为符号化表示的查询;矩阵生成器924,用于对查询图生成模块910所生成的有向生成树/森林进行广度优先搜索,构建SQL语句以便迭代生成中间结果表;谓词参数实例化单元926,用于在矩阵生成器924迭代生成中间结果表期间,根据上一层次遍历的中间结果表对新构建的SQL语句中的谓词参数进行实例化表示,从而使得矩阵生成器924生成最终的满足行集数约束条件的中间结果表;以及候选查询生成器928,用于根据矩阵生成器924生成的最终中间结果生成一组候选测试查询,如果必要,可以选择输出满足相对偏差要求的优选测试查询。

    其中,符号化查询表示器922为可选模块,可以不必对输入查询进行符号化而直接处理输入的查询,也可以在对输入查询进行符号化处理之后发送给查询图生成模块910,以方便查询图生成模块的处理。当然,在最终生成测试查询时,应当将符号化表示的查询进行反符号化处理,返回到实际查询中所使用的查询元素。

    测试用例生成模块930根据查询生成模块920所生成的测试查询生成测试用例,主要包括:候选查询评价器932,用于评价查询生成模块920所生成的测试用例候选;测试用例生成器934,用于根据候选查询评价器932的评价结果,为用户提供符合要求的测试用例;以及测试用例生成器用户接口936,用于与用户交互。

    以上各个模块和单元的具体处理过程与上面参照附图说明的自动生成数据库查询的方法的各个实施例中的相应步骤相类似,为了简洁起见,在此略去其详细描述。

    另外,在数据库层950中提供了测试查询存储库952用以保存用户提供的测试工作负载(一组查询)的所有相关信息、行集数约束规范、以及所生成的可以重复使用的测试用例等等。当然,在数据库层950中还保存有用于进行查询测试的测试数据库954。

    此外,根据本发明的自动生成数据库查询的系统具有很好的扩展性,能够通过数据抽象层940方便地与其他用户工具和其他外部模块960集成。例如,外部模块960中的测试数据生成器962、测试自动化工具964、性能测试工具966、数据库测试工具968等工具与本发明各个实施例所提供的技术方案具有很好的兼容性。

    还应该指出的是,根据本发明的自动生成数据库查询的方法和系统也支持基于关键字和基于相似性的搜索功能。

    以上结合具体实施例描述了本发明的基本原理,但是,需要指出的是,对本领域的普通技术人员而言,能够理解本发明的方法和装置的全部或者任何步骤或者部件,可以在任何计算设备(包括处理器、存储介质等)或者计算设备的网络中,以硬件、固件、软件或者它们的组合加以实现,这是本领域普通技术人员在阅读了本发明的说明的情况下运用他们的基本编程技能就能实现的,因此在这里省略了详细说明。

    因此,基于上述理解,本发明的目的还可以通过在任何信息处理设备上运行一个程序或者一组程序来实现。所述信息处理设备可以是公知的通用设备。因此,本发明的目的也可以仅仅通过提供包含实现所述方法或者设备的程序代码的程序产品来实现。也就是说,这样的程序产品也构成本发明,并且存储有这样的程序产品的存储介质也构成本发明。显然,所述存储介质可以是任何公知的存储介质或者将来所开发出来的任何存储介质,因此也没有必要在此对各种存储介质一一列举。

    在本发明的设备和方法中,显然,各部件或各步骤是可以分解和/或重新组合的。这些分解和/或重新组合应视为本发明的等效方案。并且,执行上述系列处理的步骤可以自然地按照说明的顺序按时间顺序执行,但是并不需要一定按照时间顺序执行。某些步骤可以并行或彼此独立地执行。

    以上描述了本发明的优选实施方式。本领域的普通技术人员知道,本发明的保护范围不限于这里所公开的具体细节,而可以具有在本发明的精神实质范围内的各种变化和等效方案。

自动生成数据库查询的方法和系统.pdf_第1页
第1页 / 共41页
自动生成数据库查询的方法和系统.pdf_第2页
第2页 / 共41页
自动生成数据库查询的方法和系统.pdf_第3页
第3页 / 共41页
点击查看更多>>
资源描述

《自动生成数据库查询的方法和系统.pdf》由会员分享,可在线阅读,更多相关《自动生成数据库查询的方法和系统.pdf(41页珍藏版)》请在专利查询网上搜索。

本发明公开了一种自动生成数据库查询的方法和系统,通过考虑列组数据相关性和行集数约束,能够基于谓词参数实例化自动生成用于数据库的查询。根据本发明一个实施例的生成数据库查询的方法包括:接收输入查询和行集数约束;以及根据数据库的列组数据相关性对输入查询的局部谓词参数进行实例化,以生成满足行集数约束的候选测试查询。所述生成测试查询的步骤包括步骤:为输入查询构建有向查询图;对有向查询图进行遍历以构建有向生成。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 物理 > 计算;推算;计数


copyright@ 2017-2020 zhuanlichaxun.net网站版权所有
经营许可证编号:粤ICP备2021068784号-1