一种关系数据库中数据查询的方法与流程

文档序号:33504247发布日期:2023-03-17 23:11阅读:36来源:国知局
一种关系数据库中数据查询的方法与流程

1.本发明涉及关系数据库管理技术领域,尤其涉及一种关系数据库中数据查询的方法。


背景技术:

2.在典型的关系数据库管理系统中处理一个查询,一般包括三个阶段:词法语法分析阶段,该阶段将用户的输入文本(sql)转化成一个适用于数据库内部的数据结构,一般称为语法解析树,并验证语法解析树的正确性,得到一个表示sql的语法解析树,其实质是将用户的输入文本转换为数据库内部的数据表达式;查询优化阶段,该阶段基于规则以及物理代价将前一个阶段的语法解析树进行优化,生成一个最优的查询计划,该阶段对上一阶段的数据表达式不做特殊处理,将其作为生成的查询计划的一部分;执行查询计划阶段,该阶段采用递归迭代的方式将前一阶段生成的查询计划予以执行,其实质在于采用递归迭代的方式执行查询计划中的表达式,得到结果返回给用户。
3.在实际应用中,递归迭代的方式可以较好地满足简单的表达式执行,但是当对复杂的表达式进行执行处理时,递归迭代会产生大量的压栈弹栈操作,显著降低表达式执行处理的效率,从而降低数据库数据处理的效率。
4.因此,如何通过提高关系数据库中表达式的执行处理效率提高关系数据库的查询效率,成为亟待解决的技术问题。


技术实现要素:

5.有鉴于此,为了克服现有技术的不足,本发明旨在提供一种关系数据库中数据查询的方法。
6.本发明提供一种关系数据库中数据查询的方法,包括:
7.步骤s1:将用户数据查询的的输入文本解析为数据表达式,对解析获得的数据表达式进行语法验证;
8.步骤s2:遍历解析通过语法验证的数据表达式,生成指令数组,将生成的指令数组发送至查询计划;
9.步骤s3:执行查询计划阶段,根据查询计划中的指令数组执行数据表达式,获得查询结果返回至用户。
10.进一步地,本发明关系数据库中数据查询的方法,步骤s1中的数据表达式采用二叉树数据结构表示。
11.进一步地,本发明关系数据库中数据查询的方法,步骤s1中,对解析获得的数据表达式进行语法验证,包括:
12.将右子树为空且左子树为常量的表达式判定为语法验证不通过;
13.将根节点为运算符,但不存在左子树和右子树的表达式判定为语法验证不通过;
14.将根节点为运算符,左子树或/和右子树为运算符的表达式判定为语法验证不通
过;
15.将根节点为常量,但存在左子树或右子树的表达式判定为语法验证不通过。
16.进一步地,本发明关系数据库中数据查询的方法,步骤s2中,遍历解析通过语法验证的数据表达式,生成指令数组,包括:遍历通过语法验证的数据表达式的左子树和右子树,根据遍历结果以及根节点的类型对所述数据表达式进行解析和标记,生成与解析过程对应的指令数组。
17.进一步地,本发明关系数据库中数据查询的方法,步骤s2中,遍历解析通过语法验证的数据表达式,生成指令数组,包括:
18.当数据表达式的左子树和右子树为空,且根节点为常量,将所述数据表达式标记为常量;
19.当数据表达式的左子树和右子树均为常量,且根节点为运算符,将所述运算符对应的指令增加至指令数组,将所述数据表达式标记为常量,所述运算符对应的指令包括该运算符对应的参数加载操作、数据运算逻辑以及运算结果存储操作;
20.当数据表达式的左子树为空,右子树为常量,且根节点为运算符,将所述运算符对应的指令增加至指令数组,将所述数据表达式标记为常量,所述运算符对应的指令包括该运算符对应的参数加载操作、数据运算逻辑以及运算结果存储操作。
21.进一步地,本发明关系数据库中数据查询的方法,步骤s2中,遍历解析通过语法验证的数据表达式,生成指令数组,包括:
22.当数据表达式的左子树不是常量,右子树是常量,将所述数据表达式的左子树更新为当前数据表达式;
23.遍历更新后的数据表达式的左子树和右子树,根据遍历结果以及根节点的类型对所述数据表达式进行解析,将解析过程中运算符对应的指令增加至指令数组,将所述数据表达式标记为常量;
24.将所述常量作为更新前数据表达式的左子树,将更新前数据表达式的运算符对应的指令增加至指令数组,将更新前数据表达式标记为常量,所述运算符对应的指令包括该运算符对应的参数加载操作、数据运算逻辑以及运算结果存储操作。
25.进一步地,本发明关系数据库中数据查询的方法,步骤s2中,遍历解析通过语法验证的数据表达式,生成指令数组,包括:
26.当数据表达式的左子树是常量,右子树不是常量,将所述数据表达式的右子树更新为当前数据表达式;
27.遍历更新后的数据表达式的左子树和右子树,根据遍历结果以及根节点的类型对所述数据表达式进行解析和标记,将将解析过程中运算符对应的指令增加至指令数组,将所述数据表达式标记为常量;
28.将所述常量作为更新前数据表达式的右子树,将更新前数据表达式的运算符对应的指令增加至指令数组,将更新前数据表达式标记为常量,所述运算符对应的指令包括该运算符对应的参数加载操作、数据运算逻辑以及运算结果存储操作。
29.进一步地,本发明关系数据库中数据查询的方法,步骤s2中,遍历解析通过语法验证的数据表达式,生成指令数组,包括:
30.当数据表达式的左子树和右子树都不是常量,将所述数据表达式的左子树更新为
当前数据表达式,遍历更新后的数据表达式的左子树和右子树,根据遍历结果以及根节点的类型对所述数据表达式进行解析,将解析过程中运算符对应的指令增加至指令数组,将所述数据表达式标记为常量,将所述常量作为更新前数据表达式的左子树;
31.将更新前数据表达式的右子树更新为当前数据表达式,遍历更新后的数据表达式的左子树和右子树,根据遍历结果以及根节点的类型对所述数据表达式进行解析和标记,将将解析过程中运算符对应的指令增加至指令数组,将所述数据表达式标记为常量,将所述常量作为更新前数据表达式的右子树;
32.将更新前数据表达式的运算符对应的指令增加至指令数组,将更新前数据表达式标记为常量,所述运算符对应的指令包括该运算符对应的参数加载操作、数据运算逻辑以及运算结果存储操作。
33.进一步地,本发明关系数据库中数据查询的方法,步骤s3中,根据查询计划中的指令数组执行数据表达式,包括:通过指令计数器对执行的指令进行计数,所述指令计数器的初始值为零,每次执行指令数组中的指令后,检查指令计数器的计数是否等于指令数组中指令的总数,根据检查结果选择继续或结束指令执行。
34.进一步地,本发明关系数据库中数据查询的方法中,检查指令计数器的计数是否等于指令数组中指令的总数,根据检查结果选择继续或结束指令执行,包括:
35.当指令计数器的计数与指令数组中指令的总数相等,结束指令执行,将指令执行最终结果作为数据表达式的结果;
36.当指令计数器的计数与指令数组中指令的总数不相等,根据指令计数器在指令数组中定位当前执行指令,执行所述定位的当前指令,检查指令计数器的计数与指令数组中指令的总数的关系,根据检查结果继续或结束指令执行。
37.本发明关系数据库中数据查询的方法,通过将关系数据库中采用递归迭代方式计算表达式优化为解释执行指令的方式,显著减小数据库程序运行时的内存大小;提高了关系数据库中计算表达式的效率,进而提高了关系数据库中数据查询和管理的效率。
附图说明
38.为了更清楚地说明本发明实施例的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其它的附图。
39.图1为本发明技术原理涉及的表达式的二叉树数据结构示意图。
40.图2为本发明示例性第一实施例一种关系数据库中数据查询的方法的流程图。
具体实施方式
41.下面结合附图对本发明实施例进行详细描述。
42.需说明的是,在不冲突的情况下,以下实施例及实施例中的特征可以相互组合;并且,基于本公开中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本公开保护的范围。
43.需要说明的是,下文描述在所附权利要求书的范围内的实施例的各种方面。应显而易见,本文中所描述的方面可体现于广泛多种形式中,且本文中所描述的任何特定结构
及/或功能仅为说明性的。基于本公开,所属领域的技术人员应了解,本文中所描述的一个方面可与任何其它方面独立地实施,且可以各种方式组合这些方面中的两者或两者以上。举例来说,可使用本文中所阐述的任何数目个方面来实施设备及/或实践方法。另外,可使用除了本文中所阐述的方面中的一或多者之外的其它结构及/或功能性实施此设备及/或实践此方法。
44.本发明的技术原理如下:
45.通过对二叉树表达式进行遍历,实现表达式的解析。二叉树是一种递归的抽象结构,为:一颗空树或是只有一个根节点和左右两棵互不相交的左子树和右子树组成非空树(左子树和右子树也是二叉树)。用二叉树来表示一个表达式,存在以下情况:
46.1.二叉树的左右子树为空,根节点不为空,根节点是个常量,表示的是一个常量;
47.2.二叉树左右节子树都不为空,根节点是个运算符,左右子树也都是表达式,这样表示的是我们常见的2元运算符,例如常见的加减乘除等;
48.3.左子树为空,根节点不为空,右子树不为空,根节点一元运算符,右子树是表达式,这样就可以表示一元运算符。
49.例如,select a+b+c from t,其中a、b、c均为数据库表t中的三个int4类型字段,那么a+b+c就是一个典型的表达式,在数据库内部会用二叉树来进行表示,如图1所示。
50.图2为根据本发明示例性第一实施例的一种关系数据库中数据查询的方法的流程图,如图2所示,本实施例的方法,包括:
51.步骤s1:将用户数据查询的的输入文本解析为数据表达式,对解析获得的数据表达式进行语法验证;
52.步骤s2:遍历解析通过语法验证的数据表达式,生成指令数组,将生成的指令数组发送至查询计划;
53.步骤s3:执行查询计划阶段,根据查询计划中的指令数组执行数据表达式,获得查询结果返回至用户。
54.在实际应用中,本实施例方法步骤s1中的数据表达式采用二叉树数据结构表示。为了提高后续步骤的效率,本实施例方法步骤s1中,对解析获得的数据表达式进行语法验证,包括:
55.将右子树为空且左子树为常量的表达式判定为语法验证不通过;
56.将根节点为运算符,但不存在左子树和右子树的表达式判定为语法验证不通过;
57.将根节点为运算符,左子树或/和右子树为运算符的表达式判定为语法验证不通过;
58.将根节点为常量,但存在左子树或右子树的表达式判定为语法验证不通过。
59.本发明示例性第二实施例提供一种关系数据库中数据查询的方法,本实施例是图2所示方法的优选实施例,本实施例方法的步骤s2中,遍历解析通过语法验证的数据表达式,生成指令数组,包括:遍历通过语法验证的数据表达式的左子树和右子树,根据遍历结果以及根节点的类型对所述数据表达式进行解析和标记,生成与解析过程对应的指令数组。
60.本发明示例性第三实施例提供一种关系数据库中数据查询的方法,本实施例是图2所示方法的优选实施例,本实施例方法的步骤s2中,遍历解析通过语法验证的数据表达
式,生成指令数组,包括:
61.当数据表达式的左子树和右子树为空,且根节点为常量,将所述数据表达式标记为常量;
62.当数据表达式的左子树和右子树均为常量,且根节点为运算符,将所述运算符对应的指令增加至指令数组,将所述数据表达式标记为常量,所述运算符对应的指令包括该运算符对应的参数加载操作、数据运算逻辑以及运算结果存储操作;
63.当数据表达式的左子树为空,右子树为常量,且根节点为运算符,将所述运算符对应的指令增加至指令数组,将所述数据表达式标记为常量,所述运算符对应的指令包括该运算符对应的参数加载操作、数据运算逻辑以及运算结果存储操作。
64.本发明示例性第四实施例提供一种关系数据库中数据查询的方法,本实施例是图2所示方法的优选实施例,本实施例方法的步骤s2中,遍历解析通过语法验证的数据表达式,生成指令数组,包括:
65.当数据表达式的左子树不是常量,右子树是常量,将所述数据表达式的左子树更新为当前数据表达式;
66.遍历更新后的数据表达式的左子树和右子树,根据遍历结果以及根节点的类型对所述数据表达式进行解析,将解析过程中运算符对应的指令增加至指令数组,将所述数据表达式标记为常量;
67.将所述常量作为更新前数据表达式的左子树,将更新前数据表达式的运算符对应的指令增加至指令数组,将更新前数据表达式标记为常量,所述运算符对应的指令包括该运算符对应的参数加载操作、数据运算逻辑以及运算结果存储操作。
68.本发明示例性第五实施例提供一种关系数据库中数据查询的方法,本实施例是图2所示方法的优选实施例,本实施例方法的步骤s2中,遍历解析通过语法验证的数据表达式,生成指令数组,包括:
69.当数据表达式的左子树是常量,右子树不是常量,将所述数据表达式的右子树更新为当前数据表达式;
70.遍历更新后的数据表达式的左子树和右子树,根据遍历结果以及根节点的类型对所述数据表达式进行解析和标记,将将解析过程中运算符对应的指令增加至指令数组,将所述数据表达式标记为常量;
71.将所述常量作为更新前数据表达式的右子树,将更新前数据表达式的运算符对应的指令增加至指令数组,将更新前数据表达式标记为常量,所述运算符对应的指令包括该运算符对应的参数加载操作、数据运算逻辑以及运算结果存储操作。
72.本发明示例性第六实施例提供一种关系数据库中数据查询的方法,本实施例是图2所示方法的优选实施例,本实施例方法的步骤s2中,遍历解析通过语法验证的数据表达式,生成指令数组,包括:
73.当数据表达式的左子树和右子树都不是常量,将所述数据表达式的左子树更新为当前数据表达式,遍历更新后的数据表达式的左子树和右子树,根据遍历结果以及根节点的类型对所述数据表达式进行解析,将解析过程中运算符对应的指令增加至指令数组,将所述数据表达式标记为常量,将所述常量作为更新前数据表达式的左子树;
74.将更新前数据表达式的右子树更新为当前数据表达式,遍历更新后的数据表达式
的左子树和右子树,根据遍历结果以及根节点的类型对所述数据表达式进行解析和标记,将将解析过程中运算符对应的指令增加至指令数组,将所述数据表达式标记为常量,将所述常量作为更新前数据表达式的右子树;
75.将更新前数据表达式的运算符对应的指令增加至指令数组,将更新前数据表达式标记为常量,所述运算符对应的指令包括该运算符对应的参数加载操作、数据运算逻辑以及运算结果存储操作。
76.本发明示例性第七实施例提供一种关系数据库中数据查询的方法,本实施例是图2所示方法的优选实施例。
77.本实施例方法的步骤s3中,根据查询计划中的指令数组执行数据表达式,包括:通过指令计数器对执行的指令进行计数,所述指令计数器的初始值为零,每次执行指令数组中的指令后,检查指令计数器的计数是否等于指令数组中指令的总数,根据检查结果选择继续或结束指令执行。
78.具体的,当指令计数器的计数与指令数组中指令的总数相等,结束指令执行,将指令执行最终结果作为数据表达式的结果;
79.当指令计数器的计数与指令数组中指令的总数不相等,根据指令计数器在指令数组中定位当前执行指令,执行所述定位的当前指令,检查指令计数器的计数与指令数组中指令的总数的关系,根据检查结果继续或结束指令执行。
80.根据本实施例方法,对于a+b+c的表达式,其执行过程如下:
81.1.当前指令计数器的计数是0,小于2,进入下一步;
82.2.当前指令计数器0的指令是+操作,输入参数是a和b,因此执行a+b,将结果存入中间结果d;
83.3.将指令计数器自增1,当前指令计数器的计数为1,小于2,进入下一步;
84.4.当指令计数器1的指令是+操作,输入参数是d和c,因此执行d+c,将结果存入中间结果d;
85.5.将指令计数器自增1,则当前指令计数器的计数为2,等于指令长度,执行结束,将d作为执行结果返回。
86.以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到的变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应以权利要求的保护范围为准。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1