一种非相关子查询的优化方法和装置与流程

文档序号:12863916阅读:298来源:国知局
一种非相关子查询的优化方法和装置与流程

本发明涉及计算机技术领域,具体涉及一种非相关子查询的优化方法和装置。



背景技术:

数据处理系统如数据库系统、大数据处理系统等通常都以支持sql(structuredquerylanguage,结构化查询语言)功能为主要实现目标,以为用户提供数据操作便利。

在sql处理过程中,需要sql引擎对sql语句进行词法解析、语法解析、语义分析、逻辑优化和物理优化,然后把得到的执行计划交给执行器去执行,这个过程被划分为三个阶段:分析阶段、优化阶段、执行阶段。

其中,子查询的优化发生在逻辑优化阶段,是逻辑优化阶段中的优化子阶段(通常称为查询重写)。一般来说,子查询可以分相关子查询和非相关子查询两种类型。

目前非相关子查询的优化方式主要包括半连接优化和“物化”优化,其中,半连接优化,属于子查询上拉技术,是用半连接(semijoin)的语义消除子查询的一种优化形式,属于逻辑优化子阶段;物化优化是把非相关子查询子句标识为“可物化”,并在执行阶段执行一次,然后把结果缓冲,供后续使用。

然而,采用目前非相关子查询的优化方式对具有非相关子查询的数据库查询语句(如sql语句)进行优化,在执行阶段执行优化后的数据库查询语句时,需要多次访问子查询指定的表(如采用半连接优化)或者多次访问子查询指定表对应的临时表(如采用物化优化),时间花费比较大,降低了具有非相关子查询的数据库查询语句的执行效率,尤其是在面临大数据量的查询时表现的更为明显。



技术实现要素:

本发明实施例提供一种非相关子查询的优化方法和装置,可以提高具有非相关子查询的数据库查询语句的执行效率。

本发明实施例提供一种非相关子查询的优化方法,包括:

确定数据库查询语句中目标子句是否存在非相关子查询语句;

若存在,则获取目标子句对应的执行结果集的预估行数;

当所述预估行数小于预设阈值时,执行所述非相关子查询语句;

根据所述非相关子查询语句的执行结果集对所述目标子句进行改写,以消除所述非相关子查询语句。

相应的,本发明实施例还提供一种非相关子查询的优化装置,包括:

确定单元,用于确定数据库查询语句中目标子句是否存在非相关子查询语句;

获取单元,用于确定数据库查询语句中目标子句是否存在非相关子查询语句;

执行单元,用于当所述预估行数小于预设阈值时,执行所述非相关子查询语句;

改写单元,用于根据所述非相关子查询语句的执行结果集对所述目标子句进行改写,以消除所述非相关子查询语句。

本发明实施例采用确定数据库查询语句中目标子句是否存在非相关子查询语句,若存在,则获取目标子句对应的执行结果集的预估行数,当该预估行数小于预设阈值时,执行该非相关子查询语句,得到执行结果集,根据该执行结果集对该目标子句进行改写,以消除该非相关子查询语句;该方案可以在语句执行阶段之前如在逻辑优化阶段,预先执行非相关子查询语句,并根据执行结果来对非相关子查询语句所在的目标子句进行改写,以消除非相关子查询,这样在后续语句执行阶段中无需进行任何非相关查询语句相关的查询和访问,节省了数据库查询语句的执行时间,提高了具有非相关子查询的数据库查询语句的执行效率。

附图说明

为了更清楚地说明本发明实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。

图1a是本发明实施例提供的非相关子查询的优化方法的流程示意图

图1b是目前半连接优化方式的示意图;

图1c是目前物化优化方式的示意图;

图2a是本发明实施例提供的非相关子查询的优化方法的另一流程示意图;

图2b是本发明实施例提供的sql语句处理的流程示意图;

图3a是本发明实施例提供的非相关子查询的优化装置的第一种结构示意图;

图3b是本发明实施例提供的非相关子查询的优化装置的第二种结构示意图;

图3c是本发明实施例提供的非相关子查询的优化装置的第三种结构示意图;

图4是本发明实施例提供的服务器的结构示意图。

具体实施方式

下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

本发明实施例提供了一种非相关子查询的优化方法和装置。以下将分别进行详细说明。

实施例一、

本实施例将从非相关子查询的优化装置的角度进行描述,该非相关子查询的优化装置具体可以集成在服务器中,该服务器可以数据库服务器等。

一种非相关子查询的优化方法,包括:确定数据库查询语句中目标子句是否存在非相关子查询语句,若存在,则获取目标子句对应的执行结果集的预估行数,当该预估行数小于预设阈值时,执行该非相关子查询语句,得到执行结果集,根据该执行结果集对该目标子句进行改写,以消除该非相关子查询语句。

如图1a所示,该非相关子查询的优化方法的具体流程可以如下:

101、确定数据库查询语句中目标子句是否存在非相关子查询语句,若是,则执行步骤102,若否,则结束非相关子查询的优化流程。

具体地,可以在数据库查询语句的逻辑优化阶段,确定数据库查询语句中目标子句是否存在非相关子查询语句。

其中,数据库查询语句可以由多种语言实现,比如,可以由sql(structuredquerylanguage,结构化查询语言)或者其他类型语言的来实现。其中,sql可以包括dql(dataquerylanguage,数据查询语言)、dml(datamanipulationlanguage,数据操作语言)等语言。当数据库查询语句由sql实现时,数据库查询语句即为sql语句,当由dql、dml实现时,数据库查询语句即为dql语句、dml语句。

本实施例中,子查询是一种常用计算机语言如数据库查询语言中嵌套查询下层的程序模块。当一个查询是另一个查询的子部分时,可以称之为子查询;该子查询是嵌套在某个查询内的查询,因此,也可以称之为嵌套查询。

一般地,根据子查询中涉及的关系对象与外层关系对象间的关系,子查询可以分相关子查询和非相关子查询两种类型。

相关子查询为:执行依赖于外层父查询的一些属性值的子查询。相关子查询因依赖于父查询的参数,当父查询的参数改变时,相关子查询需要根据新参数值重新执行(查询优化器对相关子查询进行优化有一定意义)。

非相关子查询为:不依赖于外层父查询的任何属性值的子查询,这样子查询具有独立性,可独自求解,形成一个子查询计划先于外层的查询求解。

本实施例中,非相关子查询语句一般嵌套在数据库查询语句的目标子句当中,该目标子句可以为可能出现子查询的子句,比如条件子句。以数据库查询语句为sql语句时,目标子句可以包括:

a)目标列位置:子查询如果位于目标列,则只能是标量子查询,否则数据库可能返回类似“错误:子查询必须只能返回一个字段”的提示。

b)from子句:相关子查询出现在from子句中,数据库可能返回类似“在from子句中的子查询无法参考相同查询级别中的关系”的提示,所以相关子查询不能出现在from子句中;非相关子查询出现在from子句中,可上拉子查询到父层,在多表连接时统一考虑连接代价然后择优。

c)条件子句如(where子句):出现在where子句中的子查询,是一个条件表达式的一部分,而表达式可以分解为操作符和操作数;根据参与运算的不同的数据类型,操作符也不尽相同,如int型有“>、<、=、<>”等操作,这对子查询均有一定的要求(如int型的等值操作,要求子查询必须是标量子查询)。另外,子查询出现在where子句中的格式,也有用谓词指定的一些操作,如in、between、exists等。

d)join/on子句:join/on子句可以拆分为两部分,一是join块类似于from子句,二是on子句块类似于where子句,这两部分都可以出现子查询。子查询的处理方式同from子句和where子句。

e)groupby子句:目标列必须和groupby关联。可将子查询写在groupby位置处,但子查询用在groupby处没有实用意义。

f)orderby子句:可将子查询写在orderby位置处。但orderby操作是作用在整条sql语句上的,子查询用在orderby处没有实用意义。

102、获取目标子句对应的执行结果集的预估行数。

其中,目标子句对应的执行结果集为执行该目标子句得到的结果集。该预估行数即为目标子句对应的执行计划的估计基数,可以为从数据表结果集或索引返回的估计行数。

以sql语句为例,假设sql语句如下(uk表示唯一键):

select*fromt1

whereukin(selectk2_2fromt2wherek2_2>2);

此时,便可以执行where条件子句对应的结果集的预估行数,也即从t2表中查询到的结果集。

其中,目标子句如条件子句对应的执行结果集的预估行数可以基于表的历史估计行数和选择率得到。也即步骤“获取目标子句对应的执行结果集的预估行数”可以包括:

获取目标子句对应的待查询表的历史估计行数(记为rows);

根据该目标子句的表达式获取相应的选择率(记为s);

根据该历史估计行数和该选择率,获取目标子句对应的待查询表的预估行数(记为w_rows)。

比如,通过公式w_rows=rows*s便可以计算出目标子句对应的执行结果集的预估行数。

其中,待查询表的历史估计行数为此刻之前该待查询表的估计行数,一般可以在查询语句处理过程中,设置一数据统计模块来统计记录待查询表的估计行数,形成历史统计数据。

因此,本实施例中,可以从历史统计数据中获取目标子句对应的待查询表的估计行数,即历史估计行数。

例如,通过上述介绍的方式本实施例可以计算where条件子句对应的执行结果集的预估行数,这个过程与常规的计算实际行数的过程一样。譬如,如果非相关子查询子句没有where条件,则选择率为1,即相当于w_rows等于rows。

103、当该预估行数小于预设阈值时,执行该非相关子查询语句。

本实施例如果预估行数比较大时,如超过预设阈值时,那么执行本实施例优化方法效果不太明显,节省的时间不多,因此,可以不采用本发明实施例提供的优化方法,采用常规优化方式,以节省资源。

其中,预设阈值(kmax)是一个哨兵值,正整数,表示的是本发明实施例优化方法所支持的非相关子查询的结果集的大小,该预设阈值是一个系统/会话参数,其可以根据实际需求设定,另外,该预设阈值还可以动态调节,比如,默认值为2000,最大值为20000(用户可定义)等。

104、根据非相关子查询语句的执行结果集对该目标子句进行改写,以消除该非相关子查询语句。

具体地,当执行完非相关子查询语句时,可以根据非相关执行结果集对目标子句进行改写。

本实施例中根据执行结果集对目标子句改写的方式包括:直接将目标子句的表达式中非相关子查询语句替换为执行结果、以消除非相关子查询。

例如,以sql语句为例,假设sql语句如下(uk表示唯一键):

select*fromt1

whereukin(selectk2_2fromt2wherek2_2>2);

非相关子查询“selectk2_2fromt2wherek2_2>2”被执行后,得到的执行结果为:{3,4}。

那么,可以将原先的sql语句的where子句变为:

whereukin{3,4}。

优选地,本实施例还可以进一步简化目标子句如条件子句的表达式,提升数据库查询语句的执行效率。比如,在将目标子句的表达式中非相关子查询语句替换为执行结果之后,还可以根据目标子句中的操作符对替换后的表达式进行相应的简化变形。也即步骤“根据该执行结果集对该目标子句进行改写”可以包括:

将该目标子句的表达式中非相关子查询语句替换为非相关子查询语句的执行结果集;

根据该目标子句中的操作符,对替换后的表达式进行相应的变形优化。

例如,以sql语句为例,假设sql语句如下(uk表示唯一键):

select*fromt1

whereukin(selectk2_2fromt2wherek2_2>2);

非相关子查询“selectk2_2fromt2wherek2_2>2”被执行后,得到的执行结果为:{3,4}。

那么,可以将原先的sql语句的where子句变为:

whereukin{3,4};

由于操作符为“in”因此,可以将原先的sql语句的where子句将变形:

whereuk=3oruk=4;

这样,原先的sql语句就可以变形为:

select*fromt1

whereuk=3oruk=4

观察上面的这条sql语句,由原先的带有子查询的查询变为了单表扫描,且可以利用uk上的唯一索引,进行2次索引扫描就能得到查询结果,所以整个sql语句的时间复杂度变为了o(1),提升了该条sql语句的执行效率。

另外,其他的非in子查询的子句,也可以做类似变换(本文不再举例,同样适用于:<op>some、<op>any、<op>all、like、between…and等操作符。也适用于:=、>、>=、<、<=等操作符。另外,也适用于in、notin、exists、notexists),比如:

select*fromt1

whereuk>some(selectk2_2fromt2wherek2_2>2);

可以变换为:

uk>min(3,4)

然后进一步变形为:

uk>3

即初始的sql语句变形为(这个优化,适合在索引上使用范围扫描加速查询速度):

select*fromt1

whereuk>3。

可选地,为了节省资源,本实施例可以在执行非相关子查询语句的过程中,如果获得的执行结果集的行数(即元组个数)大于预设阈值时停止执行非相关子查询语句,结束非相关子查询的优化流程,否则继续执行非相关子查询语句。也即,步骤“执行该非相关子查询语句”可以包括:

执行非相关子查询语句,并在执行的过程中实时获取当前执行结果集的行数;

判断当前执行结果集的行数是否大于预设阈值;

若是,则停止执行非相关子查询语句,结束非相关子查询的优化流程;

若否,则继续执行非相关子查询语句,返回执行步骤“在执行的过程中实时获取当前执行结果集的行数”,直到执行完非相关子查询语句为止。

此时,步骤“根据该非相关子查询语句的执行结果集对该目标子句进行改写”可以包括:当执行完非相关子查询语句时,根据该非相关子查询语句的执行结果集对该目标子句进行改写。

其中,预设阈值为前述的哨兵值kmax,在执行非相关子查询的过程中,可以对获得的元组进行计数操作(即获取当前执行结果集的行数),如果获得的元组个数超过哨兵值kmax,则停止子查询的执行,结束非相关子查询的优化流程。

可选地,在消除非相关子查询语句之后,本实施例优化方法还可以包括:对改写后目标子句进行相应的逻辑优化。比如,如果改写后目标子句包含常量等式或不等式时,可以根据改写后目标子句包含的常量等式或不等式,对改写后目标子句的表达式进行优化。也即,步骤“对改写后目标子句进行相应的逻辑优化”可以包括:

当改写后目标子句包含常量等式或不等式时,根据改写后目标子句包含的常量等式或不等式,对改写后目标子句的表达式进行优化。

例如,以sql语句为例,假设sql语句如下(uk表示唯一键):

select*fromt1,t3

wheret1.ukin(selectk2_2fromt2wherek2_2>3)

andt1.uk=t3.uk;

根据非相关子查询语句“selectk2_2fromt2wherek2_2>3”的执行结果可以将where子句变为:

wheret1.uk=4

andt1.uk=t3.uk;

这样,原先的sql语句就变为:

select*fromt1,t3

wheret1.uk=4

andt1.uk=t3.uk;

由于经过非相关子查询优化后的where子句包含常量等式,因此,可以根据常量等式对where子句进行进一步逻辑优化,得到优化后的sql语句为:

select*fromt1,t3

wheret1.uk=4

andt3.uk=4;

这样,对表t1和t3的连接操作,变为在两个表上先分别作一次索引扫描,然后各自有一条元组参与连接操作,所以连接的时间复杂度变为o(1),大大地提高了连接的效率和语句执行效率。

由上可知,本发明实施例提供的非相关子查询的优化方案可以在语句执行阶段之前如在逻辑优化阶段,预先执行非相关子查询语句,并根据执行结果来对非相关子查询语句所在的目标子句进行改写,以消除非相关子查询,这样在后续语句执行阶段中无需进行任何非相关查询语句相关的查询和访问,节省了数据库查询语句的执行时间,提高了具有非相关子查询的数据库查询语句的执行效率。

例如,当采用半连接优化方式对数据库查询语句进行非相关子查询的优化时,从语句执行结果来看,尽管子查询被消除,但是,连接操作存在,在执行器执行语句期间,对于子查询指定的表还是需要多次访问的,这样数据库查询语句的执行效率不会高,连接的时间花费较多。如果是大数据量的查询,多次访问表还会造成很大性能损失。

例如,以mysql为例,说明半连接优化方式,参考图1b,从图1b中的执行结果来看,尽管子查询被消除,但是,连接操作存在。其中,id值都为1表示是同一个层次即子查询不存在了,“showwarnings”命令的显示结果表明非相关子查询被优化为了半连接(semijoin)。在执行器执行期间,对于子查询指定的表t2还是需要多次访问的,这样sql语句的执行效率不会高,连接的时间花费为o(n*m)。如果是大数据量的查询,多次访问表t2会造成很大性能损失。

然而,本发明实施例提供的非相关子查询的优化方式可以预先执行非相关子查询语句,并根据执行结果来对非相关子查询语句所在的目标子句进行改写,以消除非相关子查询,相比半连接优化方式,可以避免在语句执行多次访问子查询指定的表,节省了语句执行时间(具体地节省了子查询和父查询做连接操作的时间),提升了语句执行效率。

又例如,当采用物化优化方式对数据库查询语句进行非相关子查询的优化时,从语句执行结果来看,子查询没有被消除,只是被物化到一个临时表中,而且连接操作存在,在执行器执行期间,对于子查询指定的表的物化后的临时表还是需要多次访问的,连接的时间花费较大,这样语句的执行效率不会高。如果是大数据量的查询,临时表需要多次访问会造成很大性能损失。比如,参考图1c,以mysql为例,说明物化优化方式,参考图1c,从图1c中的执行结果来看,查询没有被消除,只是被物化到一个临时表中(materialized)。然后,物化的临时表<subquery2>和表t1做了半连接操作(semijoin)。在执行器执行期间,对于子查询指定的表t2的物化后的临时表还是需要多次访问的,连接的时间花费为o(n*m),这样sql语句的执行效率不会高。如果是大数据量的查询,临时表需要多次访问会造成很大性能损失。

然而,本发明实施例提供的非相关子查询的优化方式可以预先执行非相关子查询语句,并根据执行结果来对非相关子查询语句所在的目标子句进行改写,以消除非相关子查询,相比物化优化方式,可以避免在语句执行多次访问子查询指定表物化后的临时表,节省了语句执行时间(具体地节省了子查询和父查询做连接操作的时间),提升了语句执行效率。

实施例二、

根据实施例一所描述的方法,以下将举例作进一步详细说明。

本发明实施例以非相关子查询的优化装置集成在服务器中,且数据库查询语句为sql语句为例,来介绍本发明提供的非相关子查询的优化方法。

如图2a所示,一种非相关子查询的优化方法,具体流程可以如下:

201、服务器在sql语句的逻辑优化阶段,确定sql语句中目标子句是否存在非相关子查询语句;若是,则执行步骤202,若否,结束非相关子查询的优化流程。

其中,目标子句可以为可能出现子查询的子句,比如可以为where子句、from子句、join/on子句等等。

202、服务器从统计数据中获取目标子句对应的待查询表的历史估计行数rows。

203、服务器根据历史估计行数rows和选择率s,获取目标子句对应的待查询表的预估行数w_rows。

比如,通过公式w_rows=rows*s便可以计算出目标子句对应的执行结果集的预估行数。

例如,可以计算where条件子句对应的执行结果集的预估行数,这个过程,与常规的计算实际行数的过程一样。如果非相关子查询子句没有where条件,则选择率为1,即相当于w_rows等于rows。

204、服务器判断预估行数是否小于预设阈值kmax,若是,则执行步骤205,若否,则结束非相关子查询的优化流程。

其中,预设阈值kmax表示的是本发明实施例优化方法所支持的非相关子查询的结果集的大小,该kmax是一个系统/会话参数,其可以根据实际需求设定,另外,该kmax还可以动态调节,比如,默认值为2000,最大值为20000(用户可定义)等。

205、服务器执行非相关子查询语句,并在执行的过程中实时获取执行结果集的行数。

206、服务器判断当前执行结果集的行数是否大于预设阈值kmax,若否,则返回步骤205继续执行非相关子查询语句,若是,则停止执行非相关子查询语句,结束非相关子查询的优化流程。

比如,在执行非相关子查询语句的过程中,对获得的元组进行计数操作,如果获得的元组个数超过哨兵值kmax,则停止子查询的执行,结束流程。

常规的优化方式,是不会在优化阶段调用执行器来完成查询结果的获取,本发明实施例则提出在优化阶段即可以调用执行器,已提前获得一个非相关子查询的执行结果。

其中,w_rows>kmax:意味着非相关子查询的元组个数超过哨兵值kmax(非相关子查询是大表),则不再采用本发明实施例的优化方法,退出本优化方法,可以依旧采用常规的优化方式。

207、当执行完非相关子查询语句时,服务器根据当前执行结果集对该目标子句进行改写,以消除该非相关子查询语句。

比如,可以直接将目标子句的表达式中非相关子查询语句替换为执行结果、以消除非相关子查询。

又比如,在将目标子句的表达式中非相关子查询语句替换为执行结果之后,还可以根据目标子句中的操作符对替换后的表达式进行相应的简化变形。具体地,将该目标子句的表达式中非相关子查询语句替换为该执行结果集;根据该目标子句中的操作符,对替换后的表达式进行相应的变形优化。

select*fromt1

whereuk>some(selectk2_2fromt2wherek2_2>2);

可以变换为:

uk>min(5,6)

然后进一步变形为:

uk>5

即初始的sql语句变形为(这个优化,适合在索引上使用范围扫描加速查询速度):

select*fromt1

whereuk>5。

可选地,本实施例在消除非相关子查询语句之后,可以对经过非相关子查询优化后的sql语句进行相应的逻辑优化。比如,当非相关子查询被变为常量等式或不等式,可以进一步优化其他表达式。非相关子查询在优化阶段执行后,即可用于化简where子句中的表达式,这一点,为逻辑优化提供了进一步优化的可能性。

例如查询语句如下:

select*fromt1,t3

wheret1.ukin(selectk2_2fromt2wherek2_2>3)

andt1.uk=t3.uk;

结果非相关子查询的优化,上述语句可以变形为

select*fromt1,t3

wheret1.uk=5

andt1.uk=t3.uk;

然后,在候后续的逻辑优化中,可以进一步变形为:

select*fromt1,t3

wheret1.uk=5

andt3.uk=5。

从上述语句可以看出:对表t1和t3的连接操作,变为在两个表上先分别作一次索引扫描,然后各自有一条元组参与连接操作,所以连接的时间复杂度变为o(1),大大地提高了连接的效率。

本实施例的非相关子查询的优化方式可以在逻辑优化阶段实施,参考图2b,在对语句进行语法分析之后,可以进入语句的逻辑优化阶段,在逻辑优化阶段中采用本发明实施例提供的优化方式进行非相关子查询的优化,在进行非相关子查询的优化之后(比如退出非相关子查询的优化即结束非相关子查询的优化流程之后,或者消除非相关子查询之后),继续对语句做相应的逻辑优化,在逻辑优化完成后,可以对语句进行物理优化,在物理优化完成后,可以调用执行器执行优化后的语句,最后返回结果集。

由上可知,本发明实施例采用确定数据库查询语句中目标子句是否存在非相关子查询语句,若存在,则获取目标子句对应的执行结果集的预估行数,当该预估行数小于预设阈值时,执行该非相关子查询语句,得到执行结果集,根据该执行结果集对该目标子句进行改写,以消除该非相关子查询语句;该方案可以在语句执行阶段之前如在逻辑优化阶段,预先执行非相关子查询语句,并根据执行结果来对非相关子查询语句所在的目标子句进行改写,以消除非相关子查询,这样在后续语句执行阶段中无需进行任何非相关查询语句相关的查询和访问,节省了数据库查询语句的执行时间,提高了具有非相关子查询的数据库查询语句的执行效率。

此外,当执行结果作为sql语句中的常量子句时,可以参与到其他类型的逻辑优化子阶段,能为sql语句开展其他类型的优化带来更多优化的可能,进一步提升语句执行效率。比如,执行结果作为dql(dataquerylanguage,数据查询语言)/dml(datamanipulationlanguage,数据操作语言)中的子句常量,可以参与到where/join-on子句的优化过程中,即进一步为where子句的优化提供了新的优化可能。

实施例三、

为了更好地实施以上方法,本发明实施例还提供非相关子查询的优化装置,如图3a所示,该非相关子查询的优化装置包括:确定单元301、获取单元302、执行单元303和改写单元304,如下:

(1)确定单元301;

确定单元301,用于确定数据库查询语句中目标子句是否存在非相关子查询语句。

具体地,确定单元301可以在数据库查询语句的逻辑优化阶段,确定数据库查询语句中目标子句是否存在非相关子查询语句。

其中,数据库查询语句可以由多种语言实现,比如,可以由sql(structuredquerylanguage,结构化查询语言)或者其他类型语言的来实现。其中,sql可以包括dql(dataquerylanguage,数据查询语言)、dml(datamanipulationlanguage,数据操作语言)等语言。

本实施例中,子查询是一种常用计算机语言如数据库查询语言中嵌套查询下层的程序模块。当一个查询是另一个查询的子部分时,可以称之为子查询;该子查询是嵌套在某个查询内的查询,因此,也可以称之为嵌套查询。

本实施例中,子查询是一种常用计算机语言如数据库查询语言中嵌套查询下层的程序模块。当一个查询是另一个查询的子部分时,可以称之为子查询;该子查询是嵌套在某个查询内的查询,因此,也可以称之为嵌套查询。

本实施例中,子查询是一种常用计算机语言如数据库查询语言中嵌套查询下层的程序模块。当一个查询是另一个查询的子部分时,可以称之为子查询;该子查询是嵌套在某个查询内的查询,因此,也可以称之为嵌套查询。

(2)获取单元302;

获取单元302,用于当确定单元301确定存在非相关子查询语句时,获取目标子句对应的执行结果集的预估行数。

其中,目标子句对应的执行结果集为执行该目标子句得到的结果集。该预估行数即为目标子句对应的执行计划的估计基数,可以为从数据表结果集或索引返回的估计行数。

本实施例中,目标子句如条件子句对应的执行结果集的预估行数可以基于表的历史估计行数和选择率得。比如,获取单元302,可以具体用于:获取目标子句对应的待查询表的历史估计行数;根据该目标子句的表达式获取相应的选择率;根据该历史估计行数和该选择率,获取目标子句对应的待查询表的预估行数。

比如,通过公式w_rows=rows*s便可以计算出目标子句对应的执行结果集的预估行数。

(3)执行单元303;

执行单元303,用于当该预估行数小于预设阈值时,执行该非相关子查询语句。

其中,预设阈值(kmax)是一个哨兵值,正整数,表示的是本发明实施例优化方式所支持的非相关子查询的结果集的大小,该预设阈值是一个系统/会话参数,其可以根据实际需求设定,另外,该预设阈值还可以动态调节,比如,默认值为2000,最大值为20000(用户可定义)等。

可选地,为了节省资源,本实施例可以在执行非相关子查询语句的过程中,如果获得的执行结果集的行数(即元组个数)大于预设阈值时停止执行非相关子查询语句,结束非相关子查询的优化流程,否则继续执行非相关子查询语句。也即,执行单元303可以具体用于:

执行非相关子查询语句,并在执行的过程中实时获取当前执行结果集的行数;

判断当前执行结果集的行数是否大于该预设阈值;

若否,则继续执行该非相关子查询语句,并返回获取当前执行结果集的行数的步骤,直到执行完非相关子查询语句为止。

若是,则停止执行非相关子查询语句,结束非相关子查询的优化。

(4)改写单元304;

改写单元304,用于根据该非相关子查询语句的执行结果集对该目标子句进行改写,以消除该非相关子查询语句。

比如,改写单元304,可以用于直接将目标子句的表达式中非相关子查询语句替换为执行结果、以消除非相关子查询。

又比如,在将目标子句的表达式中非相关子查询语句替换为执行结果之后,还可以根据目标子句中的操作符对替换后的表达式进行相应的简化变形,达到进一步优化目的。参考图3b,该改写单元304可以包括:

替换子单元3041,用于该目标子句的表达式中非相关子查询语句替换为非相关子查询语句的执行结果集;

改写子单元3042,用于根据该目标子句中的操作符,对替换后的表达式进行相应的变形优化,以消除该非相关子查询语句。

可选地,参考图3c,本实施例的优化装置还可以包括:逻辑优化单元305;

逻辑优化单元305可以用于改写单元304消除该非相关子查询语句之后对改写后目标子句进行相应的逻辑优化。

比如,逻辑优化单元305,可以用于在改写单元304消除该非相关子查询语句之后,当改写后目标子句包含常量等式或不等式时,根据改写后目标子句包含的常量等式或不等式,对改写后目标子句的表达式进行优化。

具体实施时,以上各个单元可以作为独立的实体来实现,也可以进行任意组合,作为同一或若干个实体来实现,以上各个单元的具体实施可参见前面的方法实施例,在此不再赘述。

该非相关子查询的优化装置具体可以集成在服务器中,如集成在数据库服务器中。

由上可知,本发明实施例优化装置通过确定单元301确定数据库查询语句中目标子句是否存在非相关子查询语句,若存在,则由获取单元302获取目标子句对应的执行结果集的预估行数,当该预估行数小于预设阈值时,由执行单元303执行该非相关子查询语句,得到执行结果集,由改写单元304根据该执行结果集对该目标子句进行改写,以消除该非相关子查询语句;该方案可以在语句执行阶段之前如在逻辑优化阶段,预先执行非相关子查询语句,并根据执行结果来对非相关子查询语句所在的目标子句进行改写,以消除非相关子查询,这样在后续语句执行阶段中无需进行任何非相关查询语句相关的查询和访问,节省了数据库查询语句的执行时间,提高了具有非相关子查询的数据库查询语句的执行效率。

实施例四、

相应的,本发明实施例还提供了一种服务器,如图4所示,其示出了本发明实施例所涉及的服务器的结构示意图,具体来讲:

该服务器400可以包括一个或者一个以上处理核心的处理器401、一个或一个以上计算机可读存储介质的存储器402、射频(radiofrequency,rf)电路403、电源404、输入单元405、以及显示单元406等部件。本领域技术人员可以理解,图4中示出的服务器结构并不构成对服务器的限定,可以包括比图示更多或更少的部件,或者组合某些部件,或者不同的部件布置。其中:

处理器401是该服务器的控制中心,利用各种接口和线路连接整个服务器的各个部分,通过运行或执行存储在存储器402内的软件程序和/或模块,以及调用存储在存储器402内的数据,执行服务器的各种功能和处理数据,从而对服务器进行整体监控。可选的,处理器401可包括一个或多个处理核心;优选的,处理器401可集成应用处理器和调制解调处理器,其中,应用处理器主要处理操作系统、用户界面和应用程序等,调制解调处理器主要处理无线通信。可以理解的是,上述调制解调处理器也可以不集成到处理器401中。

存储器402可用于存储软件程序以及模块。处理器401通过运行存储在存储器402的软件程序以及模块,从而执行各种功能应用以及数据处理。

rf电路403可用于收发信息过程中,信号的接收和发送,特别地,将基站的下行信息接收后,交由一个或者一个以上处理器401处理。另外,将涉及上行的数据发送给基站。

服务器还包括给各个部件供电的电源404(比如电池)。优选的,电源可以通过电源管理系统与处理器401逻辑相连,从而通过电源管理系统实现管理充电、放电、以及功耗管理等功能。电源404还可以包括一个或一个以上的直流或交流电源、再充电系统、电源故障检测电路、电源转换器或者逆变器、电源状态指示器等任意组件。

该服务器还可包括输入单元405,该输入单元405可用于接收输入的数字或字符信息,以及产生与用户设置以及功能控制有关的键盘、鼠标、操作杆、光学或者轨迹球信号输入。

该服务器还可包括显示单元406,该显示单元406可用于显示由用户输入的信息或提供给用户的信息以及服务器的各种图形用户接口,这些图形用户接口可以由图形、文本、图标、视频和其任意组合来构成。显示单元408可包括显示面板,可选的,可以采用液晶显示器(lcd,liquidcrystaldisplay)、有机发光二极管(oled,organiclight-emittingdiode)等形式来配置显示面板。

具体在本实施例中,服务器中的处理器401会按照如下的指令,将一个或一个以上的应用程序的进程对应的可执行文件加载到存储器402中,并由处理器401来运行存储在存储器402中的应用程序,从而实现各种功能,如下:

确定数据库查询语句中目标子句是否存在非相关子查询语句,若存在,则获取目标子句对应的执行结果集的预估行数,当所述预估行数小于预设阈值时,执行所述非相关子查询语句,根据所述非相关子查询语句的执行结果集对所述目标子句进行改写,以消除所述非相关子查询语句。

其中,根据所述非相关子查询语句的执行结果集对所述目标子句进行改写,包括:

将所述目标子句的表达式中非相关子查询语句替换为非相关子查询语句的执行结果集;

根据所述目标子句中的操作符,对替换后的表达式进行相应的变形优化。

其中,获取目标子句对应的执行结果集的预估行数,包括:

获取目标子句对应的待查询表的历史估计行数;

根据所述目标子句的表达式获取相应的选择率;

根据所述历史估计行数和所述选择率,获取目标子句对应的待查询表的预估行数。

具体的操作步骤或过程,可以参考前面非相关子查询的优化方法实施例的详细描述。

本领域普通技术人员可以理解上述实施例的各种方法中的全部或部分步骤是可以通过程序来指令相关的硬件来完成,该程序可以存储于一计算机可读存储介质中,存储介质可以包括:只读存储器(rom,readonlymemory)、随机存取记忆体(ram,randomaccessmemory)、磁盘或光盘等。

以上对本发明实施例所提供的一种非相关子查询的优化方法和装置进行了详细介绍,本文中应用了具体个例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想;同时,对于本领域的技术人员,依据本发明的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本发明的限制。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1