一种数据库查询优化方法、装置、及计算机设备转让专利

申请号 : CN201811013928.8

文献号 : CN109241101B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 姚莹莹肖意李阳潘毅蒋志勇

申请人 : 阿里巴巴集团控股有限公司

摘要 :

公开了一种数据库查询优化方法、装置、及计算机设备,所述方法包括:接收客户端发送的数据查询请求;对所述数据查询请求进行解析,根据解析结果确定用于执行所述数据查询请求的执行计划;若所述执行计划为嵌套循环反连接,则确定所述数据查询请求所指示的待查询数据表中的待查询字段是否具有存在NULL值的可能性;若所述待查询字段具有存在NULL值的可能性,则生成过滤条件,并基于所述过滤条件对所述执行计划进行优化。

权利要求 :

1.一种数据库查询优化方法,所述方法包括:

接收客户端发送的数据查询请求;

对所述数据查询请求进行解析,根据解析结果确定用于执行所述数据查询请求的执行计划;

若所述执行计划为嵌套循环反连接,则确定所述数据查询请求所指示的待查询数据表中的待查询字段是否具有存在NULL值的可能性;

若所述待查询字段具有存在NULL值的可能性,则生成过滤条件,并基于所述过滤条件对所述执行计划进行优化,其中,所述过滤条件至少包括以下两个条件:对于左表中待查询字段的字段值,其在右表的待查询字段中出现;右表中待查询字段的字段值中存在NULL值;

所述过滤条件的语义为:若满足所述过滤条件中的任一条件,则不对嵌套循环反连接中的外层循环当前遍历到的值做输出处理。

2.根据权利要求1所述的方法,所述确定所述数据查询请求所指示的待查询数据表中的待查询字段是否具有存在NULL值的可能性,包括:确定所述数据查询请求所指示的待查询数据表中待查询字段的NULL属性;

若所述待查询字段的NULL属性为默认状态,则确定所述待查询字段不具有存在NULL值的可能性;若所述待查询字段的NULL属性为非默认状态,则确定所述待查询字段具有存在NULL值的可能性;

其中,所述默认状态表示字段的值不允许为NULL值,所述非默认状态表示字段的值允许为NULL值。

3.根据权利要求1所述的方法,所述生成过滤条件包括:

确定所述待查询数据表中待查询字段的字段值的数据表现形式,所述数据表现形式为单值形式或向量形式;

根据所述数据表现形式生成过滤条件,其中,不同的数据表现形式所对应的过滤条件不同。

4.根据权利要求3所述的方法,所述根据所述数据表现形式生成过滤条件,包括:若所述数据表现形式为单值形式,则生成的过滤条件为:filter[T_OP_OR,左表中待查询字段的字段值=右表中待查询字段的字段值,(T_OP_IS,左表中待查询字段的字段值,NULL),(T_OP_IS,右表中待查询字段的字段值,NULL)];

若所述表现形式为向量形式,则生成的过滤条件为:[T_OP_AND,LNNVL(左表中待查询字段的字段值中第1个数值!=右表中待查询字段的字段值中第1个数值),……,LNNVL(左表中待查询字段的字段值中第n个数值!=右表中待查询字段的字段值中第n个数值)],其中,n为待查询字段的字段值中数值的个数,且n为不小于2的自然数。

5.根据权利要求1所述的方法,所述基于所述过滤条件对所述执行计划进行优化,包括:将所述过滤条件作为所述嵌套循环反连接中内层循环扫描的连接条件。

6.一种数据库查询优化装置,所述装置包括:

接收模块,用于接收客户端发送的数据查询请求;

解析模块,用于对所述数据查询请求进行解析,根据解析结果确定用于执行所述数据查询请求的执行计划;

确定模块,用于若所述执行计划为嵌套循环反连接,则确定所述数据查询请求所指示的待查询数据表中的待查询字段是否具有存在NULL值的可能性;

优化模块,用于若所述待查询字段具有存在NULL值的可能性,则生成过滤条件,并基于所述过滤条件对所述执行计划进行优化,其中,所述过滤条件至少包括以下两个条件:对于左表中待查询字段的字段值,其在右表的待查询字段中出现;右表中待查询字段的字段值中存在NULL值;所述过滤条件的语义为:若满足所述过滤条件中的任一条件,则不对嵌套循环反连接中的外层循环当前遍历到的值做输出处理。

7.根据权利要求6所述的装置,所述确定模块具体用于:

确定所述数据查询请求所指示的待查询数据表中待查询字段的NULL属性;若所述待查询字段的NULL属性为默认状态,则确定所述待查询字段不具有存在NULL值的可能性;若所述待查询字段的NULL属性为非默认状态,则确定所述待查询字段具有存在NULL值的可能性;

其中,所述默认状态表示字段的值不允许为NULL值,所述非默认状态表示字段的值允许为NULL值。

8.根据权利要求6所述的装置,所述优化模块包括:

形式确定子模块,用于确定所述待查询数据表中待查询字段的字段值的数据表现形式,所述数据表现形式为单值形式或向量形式;

生成子模块,用于根据所述数据表现形式生成过滤条件,其中,不同的数据表现形式所对应的过滤条件不同。

9.根据权利要求8所述的装置,所述生成子模块具体用于:

若所述数据表现形式为单值形式,则生成的过滤条件为:filter[T_OP_OR,左表中待查询字段的字段值=右表中待查询字段的字段值,(T_OP_IS,左表中待查询字段的字段值,NULL),(T_OP_IS,右表中待查询字段的字段值,NULL)];

若所述表现形式为向量形式,则生成的过滤条件为:[T_OP_AND,LNNVL(左表中待查询字段的字段值中第1个数值!=右表中待查询字段的字段值中第1个数值),……,LNNVL(左表中待查询字段的字段值中第n个数值!=右表中待查询字段的字段值中第n个数值)],其中,n为待查询字段的字段值中数值的个数,且n为不小于2的自然数。

10.根据权利要求6所述的装置,所述优化模块具体用于:

将所述过滤条件作为所述嵌套循环反连接中内层循环扫描的连接条件。

11.一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,其中,所述处理器执行所述程序时实现如权利要求1-5任一所述的方法。

说明书 :

一种数据库查询优化方法、装置、及计算机设备

技术领域

[0001] 本说明书实施例涉及数据库技术领域,尤其涉及一种数据库查询优化方法、装置、及计算机设备。

背景技术

[0002] 随着信息技术的发展,数据库得到了广泛应用,用户对数据库中数据的查询需求也越来越复杂,这就需要针对数据库的查询进行优化,以提高查询效率与准确率。其中,在对涉及表连接,且连接条件涉及NOT IN(等效于!=ALL)运算符的一类查询进行优化时,常规技术手段是将此类查询的表连接方法转换为反连接,该反连接的连接条件为T1.x=T2.y,其语义为,只要右表T2中存在满足该连接条件的记录存在,那么,左表T1中满足该连接条件的记录就会被删除,最终返回的是T1中不满足该连接条件的记录。
[0003] Nested Loop Join(嵌套循环连接,以下简称NLJ)算法是常见的表连接实现方式中的一种,其相较于其他表连接实现方式而言,具有快速响应的优点,在特定的前提条件下,使用NLJ算法也将具有非常高的执行效率,也即,在特定的前提条件下,NLJ算法从代价上来说可能是最优的执行计划。
[0004] 然而,由于在关系型数据库中,NULL值是一个特殊的存在,其特殊之处在于,NULL值与任何其它值的比较,返回结果均为unknown,例如,5=NULL,5!=NULL,NULL=NULL,NULL!=NULL,其返回结果均为unknown,从而,当采用NLJ算法作为反连接的实现方式时,对于T1.x中含有一个或多个NULL值的情形,将无法得到准确的查询结果;对于T2.y中含有一个或多个NULL值的情形,在通过NLJ算法得到查询结果后,需要再对该查询结果进行一次过滤,该过滤过程具体为:若发现T2.y中含有NULL值,则过滤掉该查询结果中的所有数据,也即最终得到一个为空的查询结果,由此可见,对于待查询表中存在NULL值的情形,采用NLJ算法作为反连接的实现方式将影响查询的效率与准确率。

发明内容

[0005] 针对上述技术问题,本说明书实施例提供一种数据库查询优化方法、装置、及计算机设备,技术方案如下:
[0006] 根据本说明书实施例的第一方面,提供一种数据库查询优化方法,所述方法包括:
[0007] 接收客户端发送的数据查询请求;
[0008] 对所述数据查询请求进行解析,根据解析结果确定用于执行所述数据查询请求的执行计划;
[0009] 若所述执行计划为嵌套循环反连接,则确定所述数据查询请求所指示的待查询数据表中的待查询字段是否具有存在NULL值的可能性;
[0010] 若所述待查询字段具有存在NULL值的可能性,则生成过滤条件,并基于所述过滤条件对所述执行计划进行优化。
[0011] 根据本说明书实施例的第二方面,提供一种数据库查询优化装置,所述装置包括:
[0012] 接收模块,用于接收客户端发送的数据查询请求;
[0013] 解析模块,用于对所述数据查询请求进行解析,根据解析结果确定用于执行所述数据查询请求的执行计划;
[0014] 确定模块,用于若所述执行计划为嵌套循环反连接,则确定所述数据查询请求所指示的待查询数据表中的待查询字段是否具有存在NULL值的可能性;
[0015] 优化模块,用于若所述待查询字段具有存在NULL值的可能性,则生成过滤条件,并基于所述过滤条件对所述执行计划进行优化。
[0016] 根据本说明书实施例的第三方面,提供一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,其中,所述处理器执行所述程序时实现本说明书实施例所提供的数据库查询优化方法。
[0017] 本说明书实施例所提供的技术方案,通过接收客户端发送的数据查询请求,对该数据查询请求进行解析,根据解析结果确定用于执行该数据查询请求的执行计划;若所确定出的执行计划为嵌套循环反连接,则确定该数据查询请求所指示的待查询数据表中的待查询字段是否具有存在NULL值的可能性;若待查询字段具有存在NULL值的可能性,则生成过滤条件,并基于该过滤条件对执行计划进行优化,可以提高采用嵌套循环连接作为反连接的实现方式时,进行数据库查询的效率与准确率。
[0018] 应当理解的是,以上的一般描述和后文的细节描述仅是示例性和解释性的,并不能限制本说明书实施例。
[0019] 此外,本说明书实施例中的任一实施例并不需要达到上述的全部效果。

附图说明

[0020] 为了更清楚地说明本说明书实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本说明书实施例中记载的一些实施例,对于本领域普通技术人员来讲,还可以根据这些附图获得其他的附图。
[0021] 图1为本说明书一示例性实施例提供的一种数据库查询优化方法的实施例流程图;
[0022] 图2为本说明书一示例性实施例提供的一种数据库查询优化装置的实施例框图;
[0023] 图3示出了本说明书实施例所提供的一种更为具体的计算设备硬件结构示意图。

具体实施方式

[0024] 为了使本领域技术人员更好地理解本说明书实施例中的技术方案,下面将结合本说明书实施例中的附图,对本说明书实施例中的技术方案进行详细地描述,显然,所描述的实施例仅仅是本说明书的一部分实施例,而不是全部的实施例。基于本说明书中的实施例,本领域普通技术人员所获得的所有其他实施例,都应当属于保护的范围。
[0025] 在SQL(Structured Query Language,结构化查询语言)查询中,有一类查询,其表现形式为:
[0026] 单值表现形式:select......from T1 where T1.x NOT IN(select T2.y where......),或,
[0027] 向量表现形式:select......from T1 where(T1.a,T1.b)NOT IN(select T2.x,T2.y where......);
[0028] 其中,NOT IN等效于!=ALL,以上述单值表现形式为例,该查询语句的语义为:对于每一个T1.x的值,如果其在T2.y中出现,那么该T1.x不满足条件,从而可以不对该T1.x做输出处理;如果其未在T2.y中出现,那么该T1.x满足条件,则可以将该T1.x输出。
[0029] 在关系型数据库中,NULL值是一个特殊的存在,其特殊之处在于,NULL值与任何其它值的比较,返回结果均为unknown,例如,5=NULL,5!=NULL,NULL=NULL,NULL!=NULL,其返回结果均为unknown,基于此,NOT IN作用于NULL值时,将采取特殊的处理方式,具体的,仍以上述单值表现形式为例,如果T2.y中含有一个或多个NULL值,那么整个查询不应该返回任何结果;如果T1.x中含有一个或多个NULL值,且T2不为空表,那么,含有NULL值的T1.x一定不会被返回。
[0030] 举例来说,假设T1=(1,2),T2=(3,NULL),也即T1.x具有两个取值,分别为1,2,对于T1.x为1的情形而言,1 NOT IN(3,NULL)可等价为1!=3 and 1!=NULL,其中,虽然1!=3的返回结果为true,但按照上述描述,1!=NULL的返回结果为unknown,从而,1!=3与1!=NULL做and逻辑运算,得到最终的返回结果为unknown,也即1 NOT IN(3,NULL)的返回结果为unknown,也即1不满足条件,从而不对1做输出处理,对于T1.x为2的情形而言,也是同样的处理方式,由此可见,如果T2.y中含有一个或多个NULL值,那么整个查询不应该返回任何结果。
[0031] 再举例来说,假设T1=(1,NULL),T2=(2,3),也即T1.x具有两个取值,分别为1,NULL,对于T1.x为1的情形而言,1 NOT IN(2,3)可等价为1!=2 and 1!=3,其中,1!=2与1!=3的返回结果均为true,那么,1 NOT IN(2,3)的返回结果为ture,即1满足条件,从而可以对1做输出处理;对于T1.x为NULL的情形而言,NULL NOT IN(2,3)可等价为NULL!=2 and NULL!=3,按照上述描述,NULL!=2与NULL!=3的返回结果均为unknown,从而,NULL NOT IN(2,3)的返回结果为unknown,即NULL不满足条件,从而不对NULL做输出处理,由此可见,如果T1.x中含有一个或多个NULL值,且T2不为空表,那么,含有NULL值的T1.x一定不会被返回。
[0032] 还需要说明的是,如果T1.x中含有一个或多个NULL值,且T2为空表,那么,对于NULL NOT IN(empty set)这一语句成立,也即返回结果为ture,从而,含有NULL值的T1.x一定会被返回。
[0033] 以上描述了将NOT IN作用于NULL值时,在各种可能出现的情形下,所应该得到的准确的查询结果。
[0034] 在现有技术中,由于用户对数据库中数据的查询需求越来越复杂,从而需要对数据库的查询进行优化,以提高查询效率与准确率。其中,在对连接条件涉及上述NOT IN运算符的一类查询进行优化时,常规技术手段是将此类查询的表连接方法转换为反连接,该反连接的连接条件为T1.x=T2.y,其语义为,只要右表T2中存在满足该连接条件的记录存在,那么,左表T1中满足该连接条件的记录就会被删除,最终反连接所返回的是T1中不满足该连接条件的记录,这就与NOT IN所实现的查询结果异曲同工。
[0035] 然而,当采用NLJ算法作为反连接的实现方式时,对于T1.x中含有一个或多个NULL值的情形,将无法得到准确的查询结果;对于T2.y中含有一个或多个NULL值的情形,在通过NLJ算法得到查询结果后,需要再对该查询结果进行一次过滤,该过滤过程具体为:若发现T2.y中含有NULL值,则过滤掉该查询结果中的所有数据,也即最终得到一个为空的查询结果。
[0036] 举例来说,假设T1=(1,2),T2=(3,NULL),当采用NLJ算法作为反连接的实现方式时,取出T1中的第一条记录1,然后遍历T2,并按照连接条件T1.x=T2.y判断T2中是否存在匹配的记录,具体的,首先判断1=3,其返回结果为false,再判断1=NULL,返回结果为unknown,从而,对于1而言,T2中不存在满足该连接条件的记录存在,可以输出1;同理,取出T2中的第二条记录,为2,然后遍历T2,并按照连接条件T1.x=T2.y判断T2中是否存在匹配的记录,最终可以得到对于2而言,T2中也不存在满足该连接条件的记录存在,则可以输出2,也即最终输出的查询结果为(1,2),这就与上述所描述的应该得到的准确的查询结果并不相符,此时,为了纠正这一类型的错误,可以确定T2.y中是否含有NULL值,若含有NULL值,则过滤掉查询结果中的所有数据,从而得到一个为空的查询结果,如此处理,则可以得到准确的查询结果。
[0037] 再举例来说,假设T1=(1,NULL),T2=(2,3),当采用NLJ算法作为反连接的实现方式时,取出T1中的第一条记录,为1,然后遍历T2,并按照连接条件T1.x=T2.y判断T2中是否存在匹配的记录,具体的,首先判断1=2,其返回结果为false,再判断1=3,返回结果仍为false,从而,对于1而言,T2中不存在满足该连接条件的记录存在,可以输出1;同理,取出T2中的第二条记录,为NULL,然后遍历T2,并按照连接条件T1.x=T2.y判断T2中是否存在匹配的记录,具体的,首先判断NULL=2,其返回结果为unknown,再判断NULL=3,其返回结果为unknown,从而,对于NULL而言,T2中也不存在满足该连接条件的记录存在,则可以输出NULL,也即最终输出的查询结果为(1,NULL),这就与上述所描述的应该得到的准确的查询结果并不相符,而相关技术中却不存在可纠正这一类型错误的实现方式。
[0038] 综上所述,对于待查询表中存在NULL值的情形,采用NLJ算法作为反连接的实现方式将影响查询的效率与准确率。
[0039] 此外,还需要说明的一点是,对于数据库中的数据采用向量表现形式的场景而言,相关技术中,无法采用反连接这一表连接方法,仅能采用笛卡尔连接(又称笛卡尔乘积)这一表连接方法。
[0040] 为了解决上述问题,本说明书实施例提供一种数据库查询优化方法。如下,示出下述实施例对该方法进行详细说明:
[0041] 请参见图1,为本说明书一示例性实施例提供的一种数据库查询优化方法的实施例流程图,该方法包括以下步骤:
[0042] 步骤102:接收客户端发送的数据查询请求。
[0043] 步骤104:对该数据查询请求进行解析,根据解析结果确定用于执行该数据查询请求的执行计划。
[0044] 在本说明书实施例中,当用户在客户端执行查询语句,例如select查询语句时,客户端会向服务器端发送数据查询请求,该数据查询请求即携带该select查询语句,以由服务器端的数据库进程来处理该数据查询请求。
[0045] 服务器端的数据库进程在处理该数据查询请求时,首先对其进行解析,具体为解析出其中的该select查询语句,进而对该select查询语句进行解析,例如,对该select查询语句进行语句合法性检查,以确定其是否合乎语法规则,若其合乎语法规则,则继续对该select查询语句进行语言含义检查,以确定其所指示的数据表、字段是否均在数据库中,进一步,当该select查询语句的语法、语义都通过检查后,继续进行数据访问权限的核对,以确定用户是否具有所请求查询的数据的访问权限,在数据访问权限核对通过后,数据库进程的查询优化器则可以根据一定的规则确定该select查询语句的执行计划,也即该数据查询请求的执行计划。
[0046] 至于数据库进程进行对该select查询语句进行解析的具体过程,以及数据库进程的查询优化器根据一定的规则确定该select查询语句的执行计划的具体过程,本领域技术人员可以参见相关技术中的详细描述,本说明书实施例对此不再详述。
[0047] 步骤106:若该执行计划为嵌套循环反连接,则确定该数据查询请求所指示的待查询数据表中的待查询字段是否具有存在NULL值的可能性。
[0048] 首先说明,本说明书实施例中所述的“嵌套循环反连接”即指采用NLJ算法作为反连接的实现方式。
[0049] 在本说明书实施例中,以数据查询请求中携带的查询语句为“select......from T1 where T1.x NOT IN(select T2.y where......)”这一查询语句为例,其所指示的待查询数据表为T1、T2,T1中的待查询字段为字段x,T2中的待查询字段为字段y,同时,在对T1、T2进行嵌套循环反连接时,又可将T1称为左表,将T2称为右表,表。
[0050] 在一实施例中,可以分别确定字段x和字段y的NULL属性,根据NULL属性确定字段x和字段y是否具有存在NULL值的可能性,具体的,若NULL属性为默认状态,则表示该字段的值不允许为NULL值,从而,该字段中的任一值都不会为NULL值,该字段也就不具有存在NULL值的可能性;相反的,若NULL属性为非默认状态,则表示该字段的值允许为NULL值,从而该字段中的允许出现NULL值,该字段也即具有存在NULL值的可能性。
[0051] 步骤108:若该待查询字段具有存在NULL值的可能性,则生成过滤条件,并基于该过滤条件对该执行计划进行优化。
[0052] 在本说明书实施例中,若确定出待查询字段具有存在NULL值的可能性,则可以生成一个过滤条件,并将该过滤条件作为嵌套循环反连接中内层循环扫描的连接条件,以实现对数据查询请求的执行计划进行优化。
[0053] 其中,生成过滤条件的过程可以包括:确定待查询字段的字段值的数据表现形式,该数据表现形式可以为单值形式或向量形式,通俗来说,单值形式即指字段值仅包括一个数值,例如,字段值为“1”,而向量形式则指字段值包括两个以上数值,例如,字段值为“(1,2)”,又例如,字段值为“(1,2,3,4)”,在本说明书实施例中,则可以根据字段值的数据表现形式生成过滤条件,其中,不同的数据表现形式所对应的过滤条件不同。
[0054] 如下,分别从单值形式、向量形式两个方面对生成的过滤条件进行描述:
[0055] 单值形式:
[0056] 所生成的过滤条件,也即嵌套循环反连接的连接条件可以为:filter[T_OP_OR,左表中待查询字段的字段值=右表中待查询字段的字段值,(T_OP_IS,左表中待查询字段的字段值,NULL),(T_OP_IS,右表中待查询字段的字段值,NULL)],该过滤条件的语义为:若满足下述(1)、(2)、(3),三个条件中的任一条件,则不对外层循环当前遍历到的字段值做输出处理,其中,
[0057] (1)对于左表中待查询字段的字段值,其在右表的待查询字段中出现;
[0058] (2)左表中待查询字段的字段值中存在NULL值;
[0059] (3)右表中待查询字段的字段值中存在NULL值。
[0060] 举例来说,假设T1=(1,2),T2=(1,NULL),对该T1与T2进行嵌套循环反连接的过程如下:首先,外层循环遍历到T1中的第一条记录1,然后,内层循环开始对T2进行遍历,首先遍历到T2中第一条记录1,此时可以发现,满足上述条件(1),内层循环结束,此时,内层循环的返回结果为true,按照anti join的语义,则不对T1中的第一条记录1做输出处理;后续,外层循环继续遍历到T1中的第二条记录2,然后,内层循环开始对T2进行遍历,首先遍历到T2中第一条记录1,此时可以发现,不满足上述条件三个条件中的任一条件,之后,内层循环继续遍历到T2中的第二条记录NULL,此时可以发现,满足上述条件(3),内层循环结束,此时,内层循环的返回结果为true,按照antijoin的语义,则不对T1中的第二条记录2做输出处理,由此可见,最终的输出结果为空,这也就与上述所描述的“如果T2.y中含有一个或多个NULL值,那么整个查询不应该返回任何结果”相符。
[0061] 再举例来说,假设T1=(1,NULL),T2=(1,3),对该T1与T2进行嵌套循环反连接的过程如下:首先,外层循环遍历到T1中的第一条记录1,然后,内层循环开始对T2进行遍历,首先遍历到T2中第一条记录1,此时可以发现,满足上述条件(1),内层循环结束,此时,内层循环的返回结果为true,按照anti join的语义,则不对T1中的第一条记录1做输出处理;后续,外层循环继续遍历到T1中的第二条记录NULL,然后,内层循环开始对T2进行遍历,首先遍历到T2中第一条记录1,此时可以发现,满足上述条件(2),内层循环结束,此时,内层循环的返回结果为true,按照anti join的语义,则不对T1中的第二条记录NULL做输出处理,这也就与上述所描述的“如果T1.x中含有一个或多个NULL值,且T2不为空表,那么,含有NULL值的T1.x一定不会被返回”相符。
[0062] 向量形式:
[0063] 所生成的过滤条件,也即嵌套循环反连接的连接条件可以为:[T_OP_AND,LNNVL(左表中待查询字段的字段值中第1个数值!=右表中待查询字段的字段值中第1个数值),……,LNNVL(左表中待查询字段的字段值中第n个数值!=右表中待查询字段的字段值中第n个数值)],其中,n为待查询字段的字段值中数值的个数,其为不小于2的自然数。
[0064] 本领域技术人员可以理解的是,上述过滤条件中的LNNVL操作符的意义是,若其所需计算的表达式本身为true,则LNNVL(表达式)的返回结果为false,反之,若所需计算的表达式本身为false或unknown,则LNNVL(表达式)的返回结果为true。
[0065] 如下,对应用上述过滤条件所得到的查询结果进行举例说明:。
[0066] 举例来说,假设T1=((1,2)、(3,4)),T2=((1,2)、(3,NULL)),对该T1与T2进行嵌套循环反连接的过程如下:首先,外层循环遍历到T1中的第一条记录(1,2),然后,内层循环开始对T2进行遍历,首先遍历到T2中第一条记录(1,2),基于上述过滤条件,可以写出如下形式的表达式:LNNVL(1!=1)AND LNNVL(2!=2),通过运算,可以得出该表达式的返回结果为true,那么,按照anti join的语义,则不对T1中的第一条记录(1,2)做输出处理;后续,外层循环遍历到T1中的第二条记录(3,4),然后,内层循环开始对T2进行遍历,首先遍历到T2中第一条记录(1,2),按照上述类似的处理,可以得到false的返回结果,之后,内层循环继续遍历到T2中的第二条记录(3,NULL),按照上述类似的处理,可以得到true的返回结果,从而,按照anti join的语义,则不对T1中的第二条记录(3,4)做输出处理。
[0067] 再举例来说,假设T1=((1,2)、(3,4)),T2=((1,2)、(2,NULL)),那么,当嵌套循环反连接的过程执行到外层循环遍历到T1中的第二条记录(3,4),内层循环遍历到T2中的第二条记录(2,NULL)这一步骤时,可以得到unknown的返回结果,此时,按照anti join的语义,则可以对T1中的第二条记录(3,4)做输出处理。
[0068] 本领域技术人员可以理解的是,将上述举例中最终的输出结果符合NOT IN的语义,由此可见,基于上述过滤条件对嵌套循环反连接这一执行计划进行优化后,可以在数据库中的数据采用向量表现形式的场景下,实现反连接这一表连接方法。
[0069] 本说明书实施例所提供的技术方案,通过接收客户端发送的数据查询请求,对该数据查询请求进行解析,根据解析结果确定用于执行该数据查询请求的执行计划;若所确定出的执行计划为嵌套循环反连接,则确定该数据查询请求所指示的待查询数据表中的待查询字段是否具有存在NULL值的可能性;若待查询字段具有存在NULL值的可能性,则生成过滤条件,并基于该过滤条件对执行计划进行优化,可以提高采用嵌套循环连接作为反连接的实现方式时,进行数据库查询的效率与准确率。
[0070] 相应于上述方法实施例,本说明书实施例还提供一种数据库查询优化装置,参见图2所示,为本说明书一示例性实施例提供的一种数据库查询优化装置的实施例框图,该装置可以包括:接收模块21、解析模块22、确定模块23,以及优化模块24。
[0071] 其中,接收模块21,用于接收客户端发送的数据查询请求;
[0072] 解析模块22,用于对所述数据查询请求进行解析,根据解析结果确定用于执行所述数据查询请求的执行计划;
[0073] 确定模块23,用于若所述执行计划为嵌套循环反连接,则确定所述数据查询请求所指示的待查询数据表中的待查询字段是否具有存在NULL值的可能性;
[0074] 优化模块24,用于若所述待查询字段具有存在NULL值的可能性,则生成过滤条件,并基于所述过滤条件对所述执行计划进行优化。
[0075] 在一实施例中,所述确定模块23具体用于:
[0076] 确定所述数据查询请求所指示的待查询数据表中待查询字段的NULL属性;若所述待查询字段的NULL属性为默认状态,则确定所述待查询字段不具有存在NULL值的可能性;若所述待查询字段的NULL属性为非默认状态,则确定所述待查询字段具有存在NULL值的可能性;
[0077] 其中,所述默认状态表示字段的值不允许为NULL值,所述非默认状态表示字段的值允许为NULL值。
[0078] 在一实施例中,所述优化模块24包括(图2中未示出):
[0079] 形式确定子模块,用于确定所述待查询数据表中待查询字段的字段值的数据表现形式,所述数据表现形式为单值形式或向量形式;
[0080] 生成子模块,用于根据所述数据表现形式生成过滤条件,其中,不同的数据表现形式所对应的过滤条件不同。
[0081] 在一实施例中,所述生成子模块具体用于:
[0082] 若所述数据表现形式为单值形式,则生成的过滤条件为:filter[T_OP_OR,左表中待查询字段的字段值=右表中待查询字段的字段值,(T_OP_IS,左表中待查询字段的字段值,NULL),(T_OP_IS,右表中待查询字段的字段值,NULL)];
[0083] 若所述表现形式为向量形式,则生成的过滤条件为:[T_OP_AND,LNNVL(左表中待查询字段的字段值中第1个数值!=右表中待查询字段的字段值中第1个数值),……,LNNVL(左表中待查询字段的字段值中第n个数值!=右表中待查询字段的字段值中第n个数值)],其中,n为待查询字段的字段值中数值的个数,且n为不小于2的自然数。
[0084] 在一实施例中,所述优化模块24具体用于:
[0085] 将所述过滤条件作为所述嵌套循环反连接中内层循环扫描的连接条件。
[0086] 可以理解的是,接收模块21、解析模块22、确定模块23,以及优化模块24作为四种功能独立的模块,既可以如图2所示同时配置在装置中,也可以分别单独配置在装置中,因此图2所示的结构不应理解为对本说明书实施例方案的限定。
[0087] 此外,上述装置中各个模块的功能和作用的实现过程具体详见上述方法中对应步骤的实现过程,在此不再赘述。
[0088] 本说明书实施例还提供一种计算机设备,其至少包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,其中,处理器执行所述程序时实现前述的数据库查询优化方法,该方法至少包括:接收客户端发送的数据查询请求,所述数据查询请求携带有select查询语句;对所述select查询语句进行解析,根据解析结果确定用于执行所述select查询语句的执行计划;若所述执行计划为嵌套循环反连接,则确定所述select查询语句所指示的待查询数据表中的待查询字段是否具有存在NULL值的可能性;若所述待查询字段具有存在NULL值的可能性,则生成过滤条件,并基于所述过滤条件对所述执行计划进行优化。
[0089] 图3示出了本说明书实施例所提供的一种更为具体的计算设备硬件结构示意图,该设备可以包括:处理器310、存储器320、输入/输出接口330、通信接口340和总线350。其中处理器310、存储器320、输入/输出接口330和通信接口340通过总线350实现彼此之间在设备内部的通信连接。
[0090] 处理器310可以采用通用的CPU(Central Processing Unit,中央处理器)、微处理器、应用专用集成电路(Application Specific Integrated Circuit,ASIC)、或者一个或多个集成电路等方式实现,用于执行相关程序,以实现本说明书实施例所提供的技术方案。
[0091] 存储器320可以采用ROM(Read Only Memory,只读存储器)、RAM(Random Access Memory,随机存取存储器)、静态存储设备,动态存储设备等形式实现。存储器320可以存储操作系统和其他应用程序,在通过软件或者固件来实现本说明书实施例所提供的技术方案时,相关的程序代码保存在存储器320中,并由处理器310来调用执行。
[0092] 输入/输出接口330用于连接输入/输出模块,以实现信息输入及输出。输入输出/模块可以作为组件配置在设备中(图3中未示出),也可以外接于设备以提供相应功能。其中输入设备可以包括键盘、鼠标、触摸屏、麦克风、各类传感器等,输出设备可以包括显示器、扬声器、振动器、指示灯等。
[0093] 通信接口340用于连接通信模块(图3中未示出),以实现本设备与其他设备的通信交互。其中通信模块可以通过有线方式(例如USB、网线等)实现通信,也可以通过无线方式(例如移动网络、WIFI、蓝牙等)实现通信。
[0094] 总线350包括一通路,在设备的各个组件(例如处理器310、存储器320、输入/输出接口330和通信接口340)之间传输信息。
[0095] 需要说明的是,尽管上述设备仅示出了处理器310、存储器320、输入/输出接口330、通信接口340以及总线350,但是在具体实施过程中,该设备还可以包括实现正常运行所必需的其他组件。此外,本领域的技术人员可以理解的是,上述设备中也可以仅包含实现本说明书实施例方案所必需的组件,而不必包含图中所示的全部组件。
[0096] 本说明书实施例还提供一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现前述的数据库查询优化方法,该方法至少包括:接收客户端发送的数据查询请求;对所述数据查询请求进行解析,根据解析结果确定用于执行所述数据查询请求的执行计划;若所述执行计划为嵌套循环反连接,则确定所述数据查询请求所指示的待查询数据表中的待查询字段是否具有存在NULL值的可能性;若所述待查询字段具有存在NULL值的可能性,则生成过滤条件,并基于所述过滤条件对所述执行计划进行优化。
[0097] 计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
[0098] 通过以上的实施方式的描述可知,本领域的技术人员可以清楚地了解到本说明书实施例可借助软件加必需的通用硬件平台的方式来实现。基于这样的理解,本说明书实施例的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在存储介质中,如ROM/RAM、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本说明书实施例各个实施例或者实施例的某些部分所述的方法。
[0099] 上述实施例阐明的系统、装置、模块或单元,具体可以由计算机芯片或实体实现,或者由具有某种功能的产品来实现。一种典型的实现设备为计算机,计算机的具体形式可以是个人计算机、膝上型计算机、蜂窝电话、相机电话、智能电话、个人数字助理、媒体播放器、导航设备、电子邮件收发设备、游戏控制台、平板计算机、可穿戴设备或者这些设备中的任意几种设备的组合。
[0100] 本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于装置实施例而言,由于其基本相似于方法实施例,所以描述得比较简单,相关之处参见方法实施例的部分说明即可。以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的模块可以是或者也可以不是物理上分开的,在实施本说明书实施例方案时可以把各模块的功能在同一个或多个软件和/或硬件中实现。也可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。本领域普通技术人员在不付出创造性劳动的情况下,即可以理解并实施。
[0101] 以上所述仅是本说明书实施例的具体实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本说明书实施例原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本说明书实施例的保护范围。