查询数据的方法和装置转让专利

申请号 : CN202210198352.7

文献号 : CN114265874B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 赵占越朱涛王国平

申请人 : 北京奥星贝斯科技有限公司

摘要 :

提供一种查询数据的方法和装置。所述方法包括:接收数据库查询语句,所述数据库查询语句包括第一数据集合和第二数据集合的连接操作,所述连接操作对应的连接条件包括第一条件和第二条件,且所述第一条件和所述第二条件之间的逻辑关系为或;将所述数据库查询语句拆分成第一子查询语句和第二子查询语句,所述第一子查询语句包括所述连接操作,且所述第一子查询语句中的所述连接操作的连接条件为所述第一条件,所述第二子查询语句包括所述连接操作,且所述第二子查询语句中的所述连接操作的连接条件为所述第二条件;对所述第一子查询语句的查询结果和所述第二子查询语句的查询结果进行合并,以确定所述数据库查询语句的查询结果。

权利要求 :

1.一种查询数据的方法,其特征在于,包括:接收数据库查询语句,所述数据库查询语句包括第一数据集合和第二数据集合的连接操作,所述连接操作对应的连接条件包括第一条件和第二条件,且所述第一条件和所述第二条件之间的逻辑关系为或;

将所述数据库查询语句拆分成第一子查询语句和第二子查询语句,所述第一子查询语句包括所述连接操作,且所述第一子查询语句中的所述连接操作的连接条件为所述第一条件,所述第二子查询语句包括所述连接操作,且所述第二子查询语句中的所述连接操作的连接条件为所述第二条件;

对所述第一子查询语句的查询结果和所述第二子查询语句的查询结果进行合并,以确定所述数据库查询语句的查询结果。

2.根据权利要求1所述的方法,其特征在于,所述连接操作为外连接操作、半连接操作或反连接操作。

3.根据权利要求1所述的方法,其特征在于,所述连接操作为外连接操作,所述第一子查询语句的查询结果包括按照所述第一条件执行所述外连接操作而生成的第一补空数据,所述第二子查询语句的查询结果包括按照所述第二条件执行所述外连接操作而生成的第二补空数据,

所述对所述第一子查询语句的查询结果和所述第二子查询语句的查询结果进行合并,包括:

去除所述第一补空数据和所述第二补空数据中的重复数据。

4.根据权利要求1所述的方法,其特征在于,所述连接操作为外连接操作,所述将所述数据库查询语句拆分成第一子查询语句和第二子查询语句,包括:针对所述外连接操作创建内联视图;

将所述内联视图拆分成所述第一子查询语句和所述第二子查询语句。

5.根据权利要求1所述的方法,其特征在于,所述第一子查询语句和所述第二子查询语句中的选择语句包括所述第一数据集合和/或所述第二数据集合的主键。

6.根据权利要求1所述的方法,其特征在于,所述第一子查询语句和/或所述第二子查询语句的连接操作基于目标连接算法执行,所述目标连接算法包括除嵌套循环连接算法之外的其他连接算法。

7.根据权利要求6所述的方法,其特征在于,所述其他连接算法包括哈希连接算法和/或合并连接算法。

8.一种查询数据的装置,其特征在于,包括:接收模块,用于接收数据库查询语句,所述数据库查询语句包括第一数据集合和第二数据集合的连接操作,所述连接操作对应的连接条件包括第一条件和第二条件,且所述第一条件和所述第二条件之间的逻辑关系为或;

拆分模块,用于将所述数据库查询语句拆分成第一子查询语句和第二子查询语句,所述第一子查询语句包括所述连接操作,且所述第一子查询语句中的所述连接操作的连接条件为所述第一条件,所述第二子查询语句包括所述连接操作,且所述第二子查询语句中的所述连接操作的连接条件为所述第二条件;

合并模块,用于对所述第一子查询语句的查询结果和所述第二子查询语句的查询结果进行合并,以确定所述数据库查询语句的查询结果。

9.根据权利要求8所述的装置,其特征在于,所述连接操作为外连接操作、半连接操作或反连接操作。

10.根据权利要求8所述的装置,其特征在于,所述连接操作为外连接操作,所述第一子查询语句的查询结果包括按照所述第一条件执行所述外连接操作而生成的第一补空数据,所述第二子查询语句的查询结果包括按照所述第二条件执行所述外连接操作而生成的第二补空数据,所述合并模块用于去除所述第一补空数据和所述第二补空数据中的重复数据。

11.根据权利要求8所述的装置,其特征在于,所述连接操作为外连接操作,所述拆分模块用于针对所述外连接操作创建内联视图;将所述内联视图拆分成所述第一子查询语句和所述第二子查询语句。

12.根据权利要求8所述的装置,其特征在于,所述第一子查询语句和所述第二子查询语句中的选择语句均包括所述第一数据集合和/或所述第二数据集合的主键。

13.根据权利要求8所述的装置,其特征在于,所述第一子查询语句和/或所述第二子查询语句的连接操作基于目标连接算法执行,所述目标连接算法包括除嵌套循环连接算法之外的其他连接算法。

14.根据权利要求13所述的装置,其特征在于,所述其他连接算法包括哈希连接算法和/或合并连接算法。

15.一种查询数据的装置,其特征在于,包括:存储器,用于存储指令;

处理器,用于执行所述存储器中存储的指令,以执行如权利要求1‑7中任一项所述的方法。

说明书 :

查询数据的方法和装置

技术领域

[0001] 本公开涉及数据库领域,并且更为具体地,涉及一种查询数据的方法和装置。

背景技术

[0002] 连接操作是访问数据库时经常使用的操作。在数据库查询语句中,如果一个连接操作的连接条件包括多个条件,且该多个条件以谓词OR连接,则在执行该连接操作时,目前
只能使用嵌套循环连接算法进行连接运算。但是,嵌套循环连接算法的执行效率较低,导致
数据库查询语句的执行性能较差。

发明内容

[0003] 本公开提供一种查询数据的方法和装置,以提升数据库查询语句的执行性能。
[0004] 第一方面,提供一种查询数据的方法,包括:接收数据库查询语句,所述数据库查询语句包括第一数据集合和第二数据集合的连接操作,所述连接操作对应的连接条件包括
第一条件和第二条件,且所述第一条件和所述第二条件之间的逻辑关系为或;将所述数据
库查询语句拆分成第一子查询语句和第二子查询语句,所述第一子查询语句包括所述连接
操作,且所述第一子查询语句中的所述连接操作的连接条件为所述第一条件,所述第二子
查询语句包括所述连接操作,且所述第二子查询语句中的所述连接操作的连接条件为所述
第二条件;对所述第一子查询语句的查询结果和所述第二子查询语句的查询结果进行合
并,以确定所述数据库查询语句的查询结果。
[0005] 可选地,作为一种可能的实现方式,所述连接操作为外连接操作、半连接操作或反连接操作。
[0006] 可选地,作为一种可能的实现方式,所述连接操作为外连接操作,所述第一子查询语句的查询结果包括按照所述第一条件执行所述外连接操作而生成的第一补空数据,所述
第二子查询语句的查询结果包括按照所述第二条件执行所述外连接操作而生成的第二补
空数据,所述对所述第一子查询语句的查询结果和所述第二子查询语句的查询结果进行合
并,包括:去除所述第一补空数据和所述第二补空数据中的重复数据。
[0007] 可选地,作为一种可能的实现方式,所述连接操作为外连接操作,所述将所述数据库查询语句拆分成第一子查询语句和第二子查询语句,包括:针对所述外连接操作创建内
联视图;将所述内联视图拆分成所述第一子查询语句和所述第二子查询语句。
[0008] 可选地,作为一种可能的实现方式,所述第一子查询语句和所述第二子查询语句中的选择语句均包括所述第一数据集合和/或所述第二数据集合的主键。
[0009] 可选地,作为一种可能的实现方式,所述第一子查询语句和/或所述第二子查询语句的连接操作基于目标连接算法执行,所述目标连接算法包括除嵌套循环连接算法之外的
其他连接算法。
[0010] 可选地,作为一种可能的实现方式,所述其他连接算法包括哈希连接算法和/或合并连接算法。
[0011] 第二方面,提供一种查询数据的装置,包括:接收模块,用于接收数据库查询语句,所述数据库查询语句包括第一数据集合和第二数据集合的连接操作,所述连接操作对应的
连接条件包括第一条件和第二条件,且所述第一条件和所述第二条件之间的逻辑关系为
或;拆分模块,用于将所述数据库查询语句拆分成第一子查询语句和第二子查询语句,所述
第一子查询语句包括所述连接操作,且所述第一子查询语句中的所述连接操作的连接条件
为所述第一条件,所述第二子查询语句包括所述连接操作,且所述第二子查询语句中的所
述连接操作的连接条件为所述第二条件;合并模块,用于对所述第一子查询语句的查询结
果和所述第二子查询语句的查询结果进行合并,以确定所述数据库查询语句的查询结果。
[0012] 可选地,作为一种可能的实现方式,所述连接操作为外连接操作、半连接操作或反连接操作。
[0013] 可选地,作为一种可能的实现方式,所述连接操作为外连接操作,所述第一子查询语句的查询结果包括按照所述第一条件执行所述外连接操作而生成的第一补空数据,所述
第二子查询语句的查询结果包括按照所述第二条件执行所述外连接操作而生成的第二补
空数据,所述合并模块用于去除所述第一补空数据和所述第二补空数据中的重复数据。
[0014] 可选地,作为一种可能的实现方式,所述拆分模块用于针对所述外连接操作创建内联视图;将所述内联视图拆分成所述第一子查询语句和所述第二子查询语句。
[0015] 可选地,作为一种可能的实现方式,所述第一子查询语句和所述第二子查询语句中的选择语句均包括所述第一数据集合和/或所述第二数据集合的主键。
[0016] 可选地,作为一种可能的实现方式,所述第一子查询语句和/或所述第二子查询语句的连接操作基于目标连接算法执行,所述目标连接算法包括除嵌套循环连接算法之外的
其他连接算法。
[0017] 可选地,作为一种可能的实现方式,所述其他连接算法包括哈希连接算法和/或合并连接算法。
[0018] 第三方面,提供一种查询数据的装置,包括:存储器,用于存储指令;处理器,用于执行所述存储器中存储的指令,以执行如第一方面或第一方面中的任意一种可能的实现方
式所述的方法。
[0019] 第四方面,提供一种计算机可读存储介质,其上存储有用于执行第一方面或第一方面中的任意一种可能的实现方式所述的方法的指令。
[0020] 第五方面,提供一种计算机程序产品,包括用于执行第一方面或第一方面中的任意一种可能的实现方式所述的方法的指令。
[0021] 本公开实施例将OR条件连接展开,从而将数据库查询语句拆分成多个子查询语句。由于展开后的连接条件均为简单连接,因此能够灵活选择多种连接算法(如执行效率更
高的哈希连接算法或合并连接算法)对连接操作进行运算,从而能够明显减少这类数据库
查询语句的执行时间。

附图说明

[0022] 为了更清楚地说明本公开实施例或背景技术中的技术方案,下面将对本公开实施例或背景技术中所需要使用的附图进行说明。
[0023] 图1是本公开实施例提供的数据查询方法的结构示意图。
[0024] 图2是本公开一个实施例提供的数据查询装置的结构示意图。
[0025] 图3是本公开另一实施例提供的数据查询装置的结构示意图。

具体实施方式

[0026] 下面结合本公开实施例中的附图对本公开实施例进行描述。以下描述中,参考形成本公开一部分并以说明之方式示出本公开实施例的具体方面或可使用本公开实施例的
具体方面的附图。应理解,本公开实施例可在其它方面中使用,并可包括附图中未描绘的结
构或逻辑变化。因此,以下详细描述不应以限制性的意义来理解,且本公开的范围由所附权
利要求书界定。例如,应理解,结合所描述方法的揭示内容可以同样适用于用于执行所述方
法的对应设备或系统,且反之亦然。例如,如果描述一个或多个具体方法步骤,则对应的设
备可以包含如功能单元等一个或多个单元,来执行所描述的一个或多个方法步骤(例如,一
个单元执行一个或多个步骤,或多个单元,其中每个都执行多个步骤中的一个或多个),即
使附图中未明确描述或说明这种一个或多个单元。另一方面,例如,如果基于如功能单元等
一个或多个单元描述具体装置,则对应的方法可以包含一个步骤来执行一个或多个单元的
功能性(例如,一个步骤执行一个或多个单元的功能性,或多个步骤,其中每个执行多个单
元中一个或多个单元的功能性),即使附图中未明确描述或说明这种一个或多个步骤。进一
步,应理解的是,除非另外明确提出,本文中所描述的各示例性实施例和/或方面的特征可
以相互组合。
[0027] 为了便于理解,先对本公开实施例涉及的一些相关技术知识进行介绍。以下相关技术作为可选方案与本公开实施例的技术方案可以进行任意结合,其均属于本公开实施例
的保护范围。本公开实施例包括以下内容中的至少部分内容。
[0028] 连接操作
[0029] 在关系数据库中,数据库查询语句(如SQL语句)经常包含连接操作(JOIN)。基于连接操作,可以将两个数据集合(如两张数据库表)按照某个条件进行合并,形成新的数据集
合。
[0030] 数据库通常支持多种类型的连接操作,它们之间的区别主要在于:从相互交叠的不同数据集合中选择用于连接的行时所采用的方法不同。以SQL语句为例,连接操作(JOIN)
的SQL语法格式是:数据集1 [连接类型] JOIN 数据集2 [连接条件]。
[0031] 连接类型有多种。例如,连接类型可以包括内连接(INNER JOIN)、外连接(OUTER JOIN)、半连接(SEMI‑JOIN)、反连接(ANTI‑JOIN)等。下面对这些连接的含义进行简单介绍。
[0032] 内连接只连接两张数据表中的匹配的行。假设有表A和表B,则(A INNER JOIN B ON A.a = B.b)的结果是这样的:先将A与B作迪卡尔积,然后做一个选择运算,只保留迪卡
尔积中满足A.a=B.b的行。
[0033] 外连接返回两表匹配的行,对不匹配行将一侧表补空之后输出。外连接可以包括左外连接(LEFT OUTER JOIN)、右外连接(RIGHT OUTER JOIN)和全外连接(FULL OUTER 
JOIN)。左外连接是指将左表中的每一个元组都作为结果的一个元组,并将右表中满足条件
的元组对应的属性加到结果中。对于右表中不能满足谓词条件的元组,则在最终结果中将
其对应的属性设为空(NULL)。从产生的结果看,左外连接相当于在内连接的基础上,增加了
这样的一些元组:它们的属性值不能匹配任何右表的元组。右外连接与左外连接是对称的。
而全外连接就是左外连接与右外连接的并集。
[0034] 半连接指的是当两张表进行关联时,只返回两张表中的匹配上的数据并且只会返回一张表(如左表)的数据。半连接一般通过数据库查询语句中出现的IN和EXISTS等关键词
表示。
[0035] 反连接指的是当两张表进行关联时,只返回主表(如左表)的数据,并且只返回主表与子表没关联上的数据。反连接一般通过数据库查询语句中出现的NOT IN和NOT EXISTS
等关键词表示。
[0036] 连接条件
[0037] 连接操作一般是在一定的连接条件下进行的。常见的连接条件包括三种:自然连接(NATURAL JOIN)、条件连接(ON谓词条件)和指定属性的连接(USING 属性)。
[0038] 对于条件连接,连接操作的条件可以是简单条件,也可以是复合条件。所谓复合条件,可以理解为多个简单条件的组合。也就是说,可以采用如“和(AND)”,“或(OR)”等逻辑关
系将多个简单条件组合在一起,形成一个更为复杂的条件。
[0039] 连接算法
[0040] 在数据库中,连接操作可以采用一种或多种连接算法实现。连接算法可以包括以下算法中的一种或多种:嵌套循环连接(NESTEDLOOPJOIN),合并连接(MERGEJOIN)和哈希连
接(HASHJOIN)。
[0041] 嵌套循环连接由两个FOR循环构成,并因此而得名。假设要连接的两个表为T1和T2,连接条件为P,则嵌套循环连接就选择其中一个作为外层循环,另一个作为内层循环,逐
一比较表T1和表T2中的每个元组,从而找出所有匹配的元组。嵌套循环连接比较通用。嵌套
循环连接与线性扫描一样,不需要索引,且不管是什么样的连接条件,该算法都适用。也就
是说,对于任何类型的连接操作,该算法都只需要做稍微的调整就能进行运算。但是,嵌套
循环连接的执行效率比较差。因为该算法过程中需要逐一比较表T1和表T2中的每一个元
组,当数据规模较大而不能完全放入内存中时其引起的磁盘与内存交换比较频繁,即使数
据能够完全放入内存,则嵌套循环连接执行过程中也会引起CPU的CACHE命中率低下,从而
严重影响系统效率。
[0042] 合并连接算法又称排序合并连接,可以用于计算自然连接和等值连接。假设要连接的两个表为T1和T2,则在进行连接之前先让表T1和表T2是有序的。然后分别对两个表进
行扫描一遍即可完成。合并连接执行起来非常高效,其时间复杂度是线性的O(n),其中n为
表T1和表T2中元组数最多的表的元组个数。
[0043] 哈希连接类似合并连接。在哈希连接算法中,哈希函数用于对两个表进行划分。此算法的基本思想是把两个表按连接属性划分成具有相同哈希值的元组集合。哈希连接不需
要索引,并且与嵌套循环连接相比,哈希连接更容易处理大结果集。
[0044] 针对数据库查询语句中的连接操作,如果该连接操作的连接条件包括多个条件,且该多个条件以逻辑关系(或谓词)OR连接,则该连接操作执行时目前只能使用嵌套循环连
接算法进行连接运算。如前文所述,嵌套循环连接算法的执行效率是比较差的。
[0045] 针对上述问题,本公开实施例将连接操作的连接条件进行OR展开。所谓OR展开,指的是将数据库查询语句拆分成多个子查询语句,每个子查询语句执行谓词OR的一个分支。
通过OR展开,可以将复杂的OR条件连接转化为多个简单条件连接。与OR条件连接只能采用
效率较低的嵌套循环连接算法执行不同,简单条件连接可以从多种连接算法中选择合适的
一种或多种连接算法(如效率较高的或性能较优的连接算法),从而提升数据库查询语言的
执行性能。
[0046] 下面对本公开实施例进行详细描述。
[0047] 图1为一种查询数据的方法。图1的方法100可以由数据库中的查询优化器执行。该数据库可以是普通数据库,也可以是分布式数据库,如OceanBase数据库。该数据库的用户
可以通过数据库查询语句对数据库进行访问。例如,用户可以利用数据库查询语句从该数
据库中读取数据。或者,用户可以利用数据库查询语句将数据写入该数据库。这里提及的数
据库查询语句例如可以是SQL语句。该数据库中可以存储有一个或多个数据集合。该数据集
合通常表现为数据库表的形式。
[0048] 参见图1,在步骤S110,接收数据库查询语句。该数据库查询语句包括第一数据集合(如第一数据表)和第二数据集合(如第二数据表)的连接操作。
[0049] 本公开实施例对连接操作的类型不作具体限定。在一些实施例中,该连接操作可以为外连接操作、半连接操作或反连接操作。以连接操作为外连接操作为例,该连接操作可
以是左外连接操作,右外连接操作或全外连接操作。
[0050] 该连接操作对应的连接条件可以包括第一条件和第二条件。该第一条件和该第二条件之间的逻辑关系为OR,或者说该第一条件和第二条件通过谓词OR连接。在一些实施例
中,可以将该第一条件和该第二条件称为简单条件,例如可以是等值连接条件。
[0051] 作为一个示例,数据库查询语句中的连接操作为外连接操作,该数据库查询语句的具体形式如下:
[0052] SELECT T1.C1 FROM T1 LEFT JOIN T2 ON (T1.C1 = T2.C1 OR T1.C2 = T2.C2) LEFT JOIN T3 ON T1.C1=T3.C1.
[0053] 在上述示例中,LEFTJOIN表示左外连接操作,该左外连接操作的连接条件(ON谓词后面的即为连接条件)包括第一条件“T1.C1 = T2.C1”以及第二条件“T1.C2 = T2.C2”,且
第一条件和第二条件通过谓词OR相连。
[0054] 作为另一示例,数据库查询语句中的连接操作为半连接操作,该数据库查询语句的具体形式如下:
[0055] SELECT C1, C2 FROM T1 WHERE EXISTS (SELECT 1 FROM T2 WHERE T1.C1 = T2.C1 OR T1.C2 = T2.C2).
[0056] 在上述示例中,EXISTS表示半连接操作,该半连接操作的连接条件包括第一条件“T1.C1 = T2.C1”以及第二条件“T1.C2 = T2.C2”,且第一条件和第二条件通过谓词OR相
连。
[0057] 作为又一示例,数据库查询语句中的连接操作为反连接操作,该数据库查询语句的具体形式如下:
[0058] SELECT C1, C2 FROM T1 WHERE NOT EXISTS (SELECT 1 FROM T2 WHERE T1.C1 = T2.C1 OR T1.C2 = T2.C2).
[0059] 在上述示例中,NOT EXISTS表示半连接操作,该半连接操作的连接条件包括第一条件“T1.C1 = T2.C1”以及第二条件“T1.C2 = T2.C2”,且第一条件和第二条件通过谓词OR
相连。
[0060] 在步骤S120,将数据库查询语句拆分成第一子查询语句(或第一查询分支)和第二子查询语句(或第二查询分支)。
[0061] 第一子查询语句包括连接操作,且该连接操作与拆分前的数据库查询语句中的连接操作相同。此外,该第一子查询语句中的该连接操作的连接条件为第一条件。换句话说,
该第一子查询语句中的连接操作与该数据库查询语句中的连接操作保持一致,不同的是,
第一子查询语句中的连接操作对应的连接条件变成了OR连接条件中的一个简单连接条件,
即上文提到的第一条件。
[0062] 第二子查询语句包括连接操作,且该连接操作与拆分前的数据库查询语句中的连接操作相同。此外,该第二子查询语句中的该连接操作的连接条件为第二条件。换句话说,
该第二子查询语句中的连接操作与该数据库查询语句中的连接操作保持一致,不同的是,
第二子查询语句中的连接操作对应的连接条件变成了OR连接条件中的一个简单连接条件,
即上文提到的第二条件。
[0063] 在一些实施例中,第一子查询语句和第二子查询语句中的选择语句可以包括第一数据集合(或第一数据表)和/或第二数据集合(或第二数据表)的主键,以便于后续对两个
子查询语句的查询结构进行合并。
[0064] 应理解,数据库查询语句中包含的连接操作的类型不同,步骤S120的实现方式可能会有所不同。例如,针对有些连接操作,可能需要先对数据库查询语句进行一些预处理。
例如,针对外连接操作,可以先创建内联视图(内联视图可以理解为数据库查询语句中的一
个子语句),然后将内联视图拆分成第一子查询语句和第二子查询语句。
[0065] 在一些实施例中,在将OR连接条件进行展开之前,可以先检查OR连接条件,以确定该OR连接条件是否满足可展开的基本条件。例如,可以对OR连接条件进行检查,以确定连接
表能否创建非空/唯一输出列,如果可以,则对该OR连接条件进行展开;如果不可以,则可以
不进行OR展开,直接执行该数据库查询语句。
[0066] 在步骤S130,将第一子查询语句的查询结果和第二子查询语句的查询结果合并,得到数据库查询语句的查询结果。
[0067] 由于第一子查询语句和/或第二子查询语句中的连接条件为简单连接条件,因此,可以采用多种连接算法实现该第一子查询语句和/或第二子查询语句。例如,可以采用除嵌
套循环连接算法之外的其他连接算法计算第一子查询语句和/或第二子查询语句的查询结
果。该其他算法例如可以包括前文提到的哈希连接算反和/或合并连接算法。相对于嵌套循
环连接算法,该其他算法具有更高的执行效率。
[0068] 综上所述,本公开实施例将OR条件连接展开,由于展开后得到的条件为简单连接条件,因此能够灵活选择如包括哈希连接在内的多种连接算法对连接操作进行运算,从而
能够明显减少这类数据库查询语句的执行时间。
[0069] 步骤S130例如可以包括:计算第一子查询语句的查询结果和第二子查询语句的查询结果的并集(UNION)。此外,在一些实施例中,如果第一查询结构和第二查询结构合并之
后存在重复的数据,还需要对数据进行去重处理。例如,假设连接操作为外连接操作,外连
接操作需要对两张表中的不匹配的行进行补空并输出。因此,第一子查询语句的查询结果
和第二子查询语句的查询结果可能包含重复的补空数据(即补空行中的取值为NULL的数
据)。面对这种情况,还需要去除第一子查询语句的查询结果和第二子查询语句的查询结果
中的重复的补空数据。去重的方式有很多,例如,可以通过添加窗口函数和谓词条件进行去
重(详细描述可以参见后文的示例)。
[0070] 在一些实施例中,如果第一子查询语句的查询结果和/或第二子查询语句的查询结果缺少非空/唯一列,可以为第一子查询语句的查询结果和/或第二子查询语句的查询结
果添加相应输出列。
[0071] 下面分别以外连接操作、半连接操作、内连接操作为例,更加详细地描述本公开实施例。应注意,下面例子仅仅是为了帮助本领域技术人员理解本公开实施例,而非要将本公
开实施例限于所例示的具体数值或具体场景。本领域技术人员根据下文所示的例子,显然
可以进行各种等价的修改或变化,这样的修改或变化也落入本公开实施例的范围内。
[0072] 示例1:外连接操作
[0073] 数据库查询语句如下:
[0074] SELECT T1.C1 FROM T1 LEFT JOIN T2 ON (T1.C1 = T2.C1 OR T1.C2 = T2.C2) LEFT JOIN T3 ON T1.C1=T3.C1.
[0075] 针对该语句,可以先使用包含OR连接条件的外连接创建内联视图V:
[0076] SELECT V.C1 FROM (SELECT T1.C1 FROM T1 LEFT JOIN T2 ON (T1.C1 = T2.C1 OR T1.C2 = T2.C2)) V LEFT JOIN T3 ON V.C1 = T3.C1.
[0077] 然后,可以对内联视图V进行OR展开,形成两个子查询语句:
[0078] SUB_SELECT_1:
[0079] SELECT T1.C1, T1.PK PK1, T2.PK PK2 FROM T1 LEFT JOIN T2 ON T1.C1 = T2.C1;
[0080] SUB_SELECT_2:
[0081] SELECT T1.C1, T1.PK PK1, T2.PK PK2 FROM T1 LEFT JOIN T2 ON T1.C2 = T2.C2 AND LNNVL (T1.C1 = T2.C1).
[0082] 从SUB_SELECT_1中可以看出,SUB_SELECT_1的连接操作与原数据库查询语句中的连接操作相同,均为T1表和T2表的外连接操作,不同的是,SUB_SELECT_1中的该外连接操作
的连接条件变成了简单连接条件:T1.C1 = T2.C1。
[0083] 从SUB_SELECT_2中可以看出,SUB_SELECT_2的连接操作与原数据库查询语句中的连接操作相同,均为T1表和T2表的外连接操作,不同的是,SUB_SELECT_2中的该外连接操作
的连接条件变成了简单连接条件:T1.C2 = T2.C2。此外,为了避免SUB_SELECT_2重复选择
已经被SUB_SELECT_1选择的匹配行,SUB_SELECT_2中增加了条件AND LNNVL (T1.C1 = 
T2.C1),即SUB_SELECT_2的查询结果包括的匹配行不包括满足“T1.C1 = T2.C1”的匹配行。
[0084] 此外,要想使得SUB_SELECT_1和SUB_SELECT_2的查询与原数据库查询语句的查询等价,需要对SUB_SELECT_1和SUB_SELECT_2的查询结果合并。为了便于后续的合并处理,
SUB_SELECT_1和SUB_SELECT_2的SELECT语句中均添加了T1表和T2表的主键,即T1.PK PK1
和T2.PK PK2。
[0085] 对展开后的两个子查询语句进行处理。左外连接需要对右表不匹配的行进行补空并输出,展开后的两个子查询语句可能重复输出补空行,因此将展开后的两个子查询语句
的查询结果使用UNION ALL 合并后,需要添加 ROW_NUMBER 窗口函数及谓词 RN = 1 OR 
PK2 IS NOTNULL,以去除多余的补空行:
[0086] SELECT C1
[0087] FROM (SELECT C1, PK2, ROW_NUMBER() OVER (PARTITION BY PK1 ORDER BY PK2 NULLS LAST) AS RN
[0088] FROM (SUB_SELECT_1 UNION ALL SUB_SELECT_2) V1) V2
[0089] WHERE RN = 1 OR PK2 IS NOT NULL.
[0090] 最后,查询优化器生成的执行计划如下:
[0091] =========================================
[0092] |ID|OPERATOR              |NAME         |
[0093] ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
[0094] |0 |HASH RIGHT OUTER JOIN |             |
[0095] |1 | TABLE SCAN           |T3           |
[0096] |2 | SUBPLAN SCAN         |VIEW3        |
[0097] |3 |  WINDOW FUNCTION     |             |
[0098] |4 |   SORT               |             |
[0099] |5 |    SUBPLAN SCAN      |VIEW2        |
[0100] |6 |     UNION ALL        |             |
[0101] |7 |      MERGE OUTER JOIN|             |
[0102] |8 |       TABLE SCAN     |T1(IDX_T1_C1)|
[0103] |9 |       TABLE SCAN     |T2(IDX_T2_C1)|
[0104] |10|      HASH OUTER JOIN |             |
[0105] |11|       TABLE SCAN     |T1           |
[0106] |12|       TABLE SCAN     |T2           |
[0107] =========================================
[0108] 相应地,上述执行计划中每个ID对应的输出结果如下:
[0109] ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
[0110] 0 ‑ output([VIEW3.VIEW2.T1.C1]), filter(nil),
[0111] equal_conds([VIEW3.VIEW2.T1.C1 = T3.C1]), other_conds(nil)
[0112]   1 ‑ output([T3.C1]), filter(nil),
[0113] access([T3.C1]), partitions(p0)
[0114]   2 ‑ output([VIEW3.VIEW2.T1.C1]), filter([VIEW3.RN = 1 OR (T_OP_IS_NOT, VIEW3.VIEW2.T2.PK, NULL, 0)]),
[0115] access([VIEW3.VIEW2.T1.C1], [VIEW3.VIEW2.T2.PK], [VIEW3.RN])
[0116]   3 ‑ output([VIEW2.T1.C1], [VIEW2.T2.PK], [T_WIN_FUN_ROW_NUMBER()]), filter(nil),
[0117] win_expr(T_WIN_FUN_ROW_NUMBER()), partition_by([VIEW2.T1.PK]), order_by([VIEW2.T2.PK, ASC]), window_type(RANGE), upper(UNBOUNDED PRECEDING), lower
(UNBOUNDED FOLLOWING)
[0118]   4 ‑ output([VIEW2.T1.C1], [VIEW2.T2.PK], [VIEW2.T1.PK]), filter(nil), sort_keys([VIEW2.T1.PK, ASC], [VIEW2.T2.PK, ASC])
[0119]   5 ‑ output([VIEW2.T1.C1], [VIEW2.T2.PK], [VIEW2.T1.PK]), filter(nil),
[0120] access([VIEW2.T1.C1], [VIEW2.T2.PK], [VIEW2.T1.PK])
[0121]   6 ‑ output([UNION([1])], [UNION([2])], [UNION([3])]), filter(nil)
[0122]   7 ‑ output([T1.C1], [T2.PK], [T1.PK]), filter(nil),
[0123] equal_conds([T1.C1 = T2.C1]), other_conds(nil)
[0124]   8‑ output([T1.C1], [T1.PK]), filter(nil),
[0125] access([T1.C1], [T1.PK]), partitions(p0)
[0126]   9‑ output([T2.C1], [T2.PK]), filter(nil),
[0127] access([T2.C1], [T2.PK]), partitions(p0)
[0128]   10 ‑ output([T1.C1], [T2.PK], [T1.PK]), filter(nil),
[0129] equal_conds([T1.C2 = T2.C2]), other_conds([lnnvl(cast(T1.C1 = T2.C1, TINYINT(‑1, 0)))])
[0130]   11‑ output([T1.C1], [T1.C2], [T1.PK]), filter(nil),
[0131] access([T1.C1], [T1.C2], [T1.PK]), partitions(p0)
[0132]   12 ‑ output([T2.C1], [T2.C2], [T2.PK]), filter(nil),
[0133] access([T2.C1], [T2.C2], [T2.PK]), partitions(p0)
[0134] 执行上述执行计划,即可得到数据库查询语句的查询结果。
[0135] 示例2:半连接操作
[0136] 数据库查询语句如下:
[0137] SELECT C1, C2 FROM T1 WHERE EXISTS (SELECT 1 FROM T2 WHERE T1.C1 = T2.C1 OR T1.C2 = T2.C2).
[0138] 针对该SQL语句,可以直接将其拆分成如下两个子查询语句:
[0139] SUB_SELECT_1:
[0140] SELECT PK, C1, C2 FROM T1 WHERE EXISTS (SELECT 1 FROM T2 WHERE T1.C1 = T2.C1).
[0141] SUB_SELECT_2:
[0142] SELECT PK, C1, C2 FROM T1 WHERE EXISTS (SELECT 1 FROM T2 WHERE T1.C2 = T2.C2).
[0143] 从SUB_SELECT_1中可以看出,SUB_SELECT_1的连接操作与原数据库查询语句中的连接操作相同,均为T1表和T2表的半连接操作,不同的是,SUB_SELECT_1中的该半连接操作
的连接条件变成了简单连接条件:T1.C1 = T2.C1。
[0144] 从SUB_SELECT_2中可以看出,SUB_SELECT_2的连接操作与原数据库查询语句中的连接操作相同,均为T1表和T2表的半连接操作,不同的是,SUB_SELECT_2中的该半连接操作
的连接条件变成了简单连接条件:T1.C2 = T2.C2。
[0145] 此外,要想使得SUB_SELECT_1和SUB_SELECT_2的查询结果与原数据库查询语句的查询结果等价,需要对SUB_SELECT_1和SUB_SELECT_2的查询结果合并。为了便于后续的合
并处理,SUB_SELECT_1和SUB_SELECT_2的SELECT语句中均添加了T1表的主键PK(因为半连
接操作只返回与T1表匹配的行,因此无需添加T2表的主键)。
[0146] 半连接操作只返回左表匹配的行,两个子查询语句可能返回重复的数据,因此使用 UNION 对两个子查询语句返回的数据进行去重合并:
[0147] SELECT C1, C2FROM (SUB_SELECT_1 UNION SUB_SELECT_2) V.
[0148] 最后,查询优化器生成的执行计划如下:
[0149] =========================================
[0150] |ID|OPERATOR              |NAME         |
[0151] ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
[0152] |0 |SUBPLAN SCAN          |VIEW2        |
[0153] |1 | HASH UNION DISTINCT  |             |
[0154] |2 |  HASH RIGHT SEMI JOIN|             |
[0155] |3 |   TABLE SCAN         |T2(IDX_T2_C1)|
[0156] |4 |   TABLE SCAN         |T1           |
[0157] |5 |  HASH RIGHT SEMI JOIN|             |
[0158] |6 |   TABLE SCAN         |T2(IDX_T2_C2)|
[0159] |7 |   TABLE SCAN         |T1           |
[0160] =========================================
[0161] 相应地,上述执行计划中每个ID对应的输出结果如下:
[0162] ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
[0163] 0 ‑ output([VIEW2.C1], [VIEW2.C2]), filter(nil),
[0164] access([VIEW2.C1], [VIEW2.C2])
[0165] 1 ‑ output([UNION([1])], [UNION([2])], [UNION([3])]), filter(nil)
[0166] 2 ‑ output([T1.C1], [T1.C2], [T1.PK]), filter(nil),
[0167] equal_conds([T1.C1 = T2.C1]), other_conds(nil)
[0168] 3 ‑ output([T2.C1]), filter(nil),
[0169] access([T2.C1]), partitions(p0)
[0170] 4 ‑ output([T1.C1], [T1.C2], [T1.PK]), filter(nil),
[0171] access([T1.C1], [T1.C2], [T1.PK]), partitions(p0)
[0172] 5 ‑ output([T1.C1], [T1.C2], [T1.PK]), filter(nil),
[0173] equal_conds([T1.C2 = T2.C2]), other_conds(nil)
[0174] 6 ‑ output([T2.C2]), filter(nil),
[0175] access([T2.C2]), partitions(p0)
[0176] 7 ‑ output([T1.C1], [T1.C2], [T1.PK]), filter(nil),
[0177] access([T1.C1], [T1.C2], [T1.PK]), partitions(p0)
[0178] 执行上述执行计划,即可得到数据库查询语句的查询结果。
[0179] 示例3:反连接操作
[0180] 数据库查询语句如下:
[0181] SELECT C1, C2 FROM T1 WHERE NOT EXISTS (SELECT 1 FROM T2 WHERE T1.C1 = T2.C1 OR T1.C2 = T2.C2).
[0182] 反连接操作和半连接操作的展开方式是类似的,不同之处在于反连接操作返回的是左表不匹配的行,因此可以使用INTERSECT对展开后的每个子查询语句的查询结果进行
合并去重。具体展开过程可以参见示例2,这里不再详述。
[0183] 最后,查询优化器生成的执行计划如下:
[0184] ===========================================
[0185] |ID|OPERATOR                |NAME         |
[0186] ‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
[0187] |0 |SUBPLAN SCAN            |VIEW2        |
[0188] |1 | HASH INTERSECT DISTINCT|             |
[0189] |2 |  HASH RIGHT ANTI JOIN  |             |
[0190] |3 |   TABLE SCAN           |T2(IDX_T2_C1)|
[0191] |4 |   TABLE SCAN           |T1           |
[0192] |5 |  HASH RIGHT ANTI JOIN  |             |
[0193] |6 |   TABLE SCAN           |T2(IDX_T2_C2)|
[0194] |7 |   TABLE SCAN           |T1           |
[0195] ===========================================
[0196] 执行上述执行计划,即可得到数据库查询语句的查询结果。
[0197] 上文结合图1,详细描述了本公开的方法实施例,下面结合图2,详细描述本公开的装置实施例。应理解,方法实施例的描述与装置实施例的描述相互对应,因此,未详细描述
的部分可以参见前面方法实施例。
[0198] 图2是本公开一个实施例提供的查询数据的装置的结构示意图。图2的装置200包括接收模块210、拆分模块220以及合并模块230。接收模块210用于接收数据库查询语句,所
述数据库查询语句包括第一数据集合和第二数据集合的连接操作,所述连接操作对应的连
接条件包括第一条件和第二条件,且所述第一条件和所述第二条件之间的逻辑关系为或。
拆分模块220用于将所述数据库查询语句拆分成第一子查询语句和第二子查询语句,所述
第一子查询语句包括所述连接操作,且所述第一子查询语句中的所述连接操作的连接条件
为所述第一条件,所述第二子查询语句包括所述连接操作,且所述第二子查询语句中的所
述连接操作的连接条件为所述第二条件。合并模块230用于对所述第一子查询语句的查询
结果和所述第二子查询语句的查询结果进行合并,以确定所述数据库查询语句的查询结
果。
[0199] 可选地,在一些实施例中,所述连接操作为外连接操作、半连接操作或反连接操作。
[0200] 可选地,在一些实施例中,所述连接操作为外连接操作,所述第一子查询语句的查询结果包括按照所述第一条件执行所述外连接操作而生成的第一补空数据,所述第二子查
询语句的查询结果包括按照所述第二条件执行所述外连接操作而生成的第二补空数据,所
述合并模块用于去除所述第一补空数据和所述第二补空数据中的重复数据。
[0201] 可选地,在一些实施例中,所述连接操作为外连接操作,所述拆分模块用于针对所述外连接操作创建内联视图;将所述内联视图拆分成所述第一子查询语句和所述第二子查
询语句。
[0202] 可选地,在一些实施例中,所述第一子查询语句和所述第二子查询语句中的选择语句均包括所述第一数据集合和/或所述第二数据集合的主键。
[0203] 可选地,在一些实施例中,所述第一子查询语句和/或所述第二子查询语句的连接操作基于目标连接算法执行,所述目标连接算法包括除嵌套循环连接算法之外的其他连接
算法。
[0204] 可选地,在一些实施例中,所述其他连接算法包括哈希连接算法和/或合并连接算法。
[0205] 图3是本公开另一实施例提供的查询数据的装置的结构示意图。图3所述的查询数据的装置300可以包括存储器310和处理器320,存储器310可以用于存储指令。处理器320可
以用于执行存储器310中存储的指令,以实现前文描述的各个方法中的步骤。在一些实施例
中,该装置300还可以包括网络接口330,处理器320与外部设备的数据交换可以通过该网络
接口330实现。
[0206] 在上述实施例中,可以全部或部分地通过软件、硬件、固件或者其他任意组合来实现。当使用软件实现时,可以全部或部分地以计算机程序产品的形式实现。所述计算机程序
产品包括一个或多个计算机指令。在计算机上加载和执行所述计算机程序指令时,全部或
部分地产生按照本公开实施例所述的流程或功能。所述计算机可以是通用计算机、专用计
算机、计算机网络、或者其他可编程装置。所述计算机指令可以存储在计算机可读存储介质
中,或者从一个计算机可读存储介质向另一个计算机可读存储介质传输,例如,所述计算机
指令可以从一个网站站点、计算机、服务器或数据中心通过有线(例如同轴电缆、光纤、数字
用户线(digital subscriber line,DSL))或无线(例如红外、无线、微波等)方式向另一个
网站站点、计算机、服务器或数据中心进行传输。所述计算机可读存储介质可以是计算机能
够存取的任何可用介质或者是包含一个或多个可用介质集成的服务器、数据中心等数据存
储设备。所述可用介质可以是磁性介质(例如,软盘、硬盘、磁带)、光介质(例如数字视频光
盘(digital video disc,DVD))、或者半导体介质(例如固态硬盘(solid state disk,
SSD))等。
[0207] 本领域普通技术人员可以意识到,结合本公开实施例描述的各示例的单元及算法步骤,能够以电子硬件、或者计算机软件和电子硬件的结合来实现。这些功能究竟以硬件还
是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每
个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本公开的
范围。
[0208] 在本公开所提供的几个实施例中,应该理解到,所揭露的系统、装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的
划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件
可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或
讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦
合或通信连接,可以是电性,机械或其它的形式。
[0209] 所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个
网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目
的。
[0210] 另外,在本公开各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。
[0211] 以上所述,仅为本公开的具体实施方式,但本公开的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本公开揭露的技术范围内,可轻易想到变化或替换,都应涵
盖在本公开的保护范围之内。因此,本公开的保护范围应以所述权利要求的保护范围为准。