查询语句优化方法、装置、计算机设备及存储介质转让专利

申请号 : CN201910935388.7

文献号 : CN110688393B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 张弘毅陈振强熊仲健靳峥

申请人 : 星环信息科技(上海)股份有限公司

摘要 :

本发明实施例公开了一种查询语句优化方法、装置、计算机设备及存储介质。所述方法包括在检测到查询优化请求时,获取所述查询优化请求指向的待处理查询,所述待处理查询中包括多个子查询;采用预设的查询优化规则,逐级对所述待处理查询中包括的满足查询优化条件的子查询组进行优化处理,得到与所述待处理查询对应的备选优化查询,所述子查询组中包括至少两个子查询;分别对所述待处理查询和所述备选优化查询进行代价评估;如果确定所述备选优化查询的代价评估结果优于所述待处理查询的代价评估结果,则将所述备选优化查询作为所述待处理查询的优化结果。本发明实施例可以优化查询,提高查询效率,降低查询成本,极大的提升查询性能。

权利要求 :

1.一种查询语句优化方法,其特征在于,包括:

在检测到查询优化请求时,获取所述查询优化请求指向的待处理查询,所述待处理查询中包括多个子查询;

采用预设的查询优化规则,逐级对所述待处理查询中包括的满足查询优化条件的子查询组进行优化处理,得到与所述待处理查询对应的备选优化查询,所述子查询组中包括至少两个子查询,其中,所述满足查询优化条件的子查询组包括满足重复查询优化条件的子查询组和/或满足分段查询优化条件的子查询组;所述满足重复查询优化条件的子查询组包括至少两个第一目标子查询,各所述第一目标子查询的比对参数集合之间仅列参数属性不同,且各所述第一目标子查询的非幂等调用方法的包含属性均为否,所述满足分段查询优化条件的子查询组包括至少两个第二目标子查询,各所述第二目标子查询的比对参数集合中查询数据表属性相同,列参数属性相同或不全相同,数据过滤条件不同,且每个所述第二目标子查询包括的聚合函数的归约属性为是;所述非幂等调用方法用于调用重复执行无法得到相同结果的函数;所述归约为一个聚合函数的计算可以转换为其他聚合函数的计算,所述比对参数集合用于存储子查询的特征参数,以及用于描述子查询的特征;

分别对所述待处理查询和所述备选优化查询进行代价评估;

如果将所述备选优化查询的代价评估结果与所述待处理查询的代价评估结果进行比较,确定所述备选优化查询的代价评估结果优于所述待处理查询的代价评估结果,则将所述备选优化查询作为所述待处理查询的优化结果,以使所述备选优化查询替换所述待处理查询进行数据查询。

2.根据权利要求1所述的方法,其特征在于,所述采用预设的查询优化规则,逐级对所述待处理查询中包括的满足查询优化条件的子查询组进行优化处理,得到与所述待处理查询对应的备选优化查询,包括:判断所述待处理查询中是否包括满足查询优化条件的至少一个子查询组;

若是,则根据子查询组所满足的查询优化条件对所述至少一个子查询组进行优化处理,得到新的子查询;

根据所述新的子查询更新所述待处理查询后,返回执行判断所述待处理查询中是否包括满足查询优化条件的至少一个子查询组的操作,直至满足结束优化条件;

将最近一次更新的所述待处理查询,作为所述备选优化查询。

3.根据权利要求2所述的方法,其特征在于,所述判断所述待处理查询中是否包括满足查询优化条件的至少一个子查询组,包括:对所述待处理查询中各个子查询进行查询语句的解析,得到与各所述子查询分别对应的比对参数集合、非幂等调用方法的包含属性以及聚合函数的归约属性,所述比对参数集合中包括:列参数属性、查询数据表属性以及数据过滤条件;

如果至少两个第一目标子查询的比对参数集合之间仅列参数属性不同,且各所述第一目标子查询的非幂等调用方法的包含属性均为否,则将所述至少两个第一目标子查询加入至满足重复查询优化条件的子查询组中;

如果至少两个第二目标子查询的比对参数集合中查询数据表属性相同,列参数属性相同或不全相同,数据过滤条件不同,且每个所述第二目标子查询包括的聚合函数的归约属性为是,则将所述至少两个第二目标子查询加入至满足分段查询优化条件的子查询组中。

4.根据权利要求3所述的方法,其特征在于,所述根据子查询组所满足的查询优化条件对所述至少一个子查询组进行优化处理,得到新的子查询,包括:在每个所述满足重复查询优化条件的子查询组中,按照列参数属性,将包括的至少两个第一目标子查询进行合并,得到新的子查询;和/或在每个所述满足分段查询优化条件的子查询组中,按照所述满足分段查询优化条件的子查询组匹配的数据过滤条件,将包括的至少两个第二目标子查询进行合并,并确定每个所述第二目标子查询的聚合函数关联的至少一个归约函数,生成公共子查询,以及指定所述公共子查询的查询结果的存储地址;

根据每个所述第二目标子查询的列参数属性包括的聚合函数与所述公共子查询中关联的至少一个所述归约函数的计算关系,所述数据过滤条件以及所述存储地址,生成所述第二目标子查询匹配的优化子查询;

将所述公共子查询与至少一个所述优化子查询均作为新的子查询。

5.根据权利要求1所述的方法,其特征在于,所述对所述备选优化查询进行代价评估,包括:计算所述备选优化查询中各子查询执行的第一代价评估值;

计算所述备选优化查询的子查询结果存储的第二代价评估值;

计算所述备选优化查询中子查询补充修改的第三代价评估值;

将所述第一代价评估值、所述第二代价评估值和所述第三代价评估值的相加结果作为所述备选优化查询的修改代价评估值。

6.根据权利要求5所述的方法,其特征在于,所述确定所述备选优化查询的代价评估结果优于所述待处理查询的代价评估结果,包括:当所述待处理查询的初始代价评估值与预设调整系数的乘积大于所述备选优化查询的修改代价评估值时,确定所述备选优化查询的代价评估结果优于所述待处理查询的代价评估结果。

7.根据权利要求1所述的方法,其特征在于,在确定所述备选优化查询的代价评估结果优于所述待处理查询的代价评估结果之前,还包括:根据历史待处理查询的初始代价评估值、历史备选优化查询的修改代价评估值、历史待处理查询的初始运行时间和历史备选优化查询的修改运行时间,修正预设调整系数。

8.一种计算机设备,包括处理器和存储器,所述存储器用于存储指令,当所述指令执行时使得所述处理器执行以下操作:在检测到查询优化请求时,获取所述查询优化请求指向的待处理查询,所述待处理查询中包括多个子查询;

采用预设的查询优化规则,逐级对所述待处理查询中包括的满足查询优化条件的子查询组进行优化处理,得到与所述待处理查询对应的备选优化查询,所述子查询组中包括至少两个子查询,其中,所述满足查询优化条件的子查询组包括满足重复查询优化条件的子查询组和/或满足分段查询优化条件的子查询组;所述满足重复查询优化条件的子查询组包括至少两个第一目标子查询,各所述第一目标子查询的比对参数集合之间仅列参数属性不同,且各所述第一目标子查询的非幂等调用方法的包含属性均为否,所述满足分段查询优化条件的子查询组包括至少两个第二目标子查询,各所述第二目标子查询的比对参数集合中查询数据表属性相同,列参数属性相同或不全相同,数据过滤条件不同,且每个所述第二目标子查询包括的聚合函数的归约属性为是;所述非幂等调用方法用于调用重复执行无法得到相同结果的函数;所述归约为一个聚合函数的计算可以转换为其他聚合函数的计算,所述比对参数集合用于存储子查询的特征参数,以及用于描述子查询的特征;

分别对所述待处理查询和所述备选优化查询进行代价评估;

如果将所述备选优化查询的代价评估结果与所述待处理查询的代价评估结果进行比较,确定所述备选优化查询的代价评估结果优于所述待处理查询的代价评估结果,则将所述备选优化查询作为所述待处理查询的优化结果,以使所述备选优化查询替换所述待处理查询进行数据查询。

9.根据权利要求8所述的计算机设备,其特征在于,所述处理器是设置为通过以下方式得到与所述待处理查询对应的备选优化查询:判断所述待处理查询中是否包括满足查询优化条件的至少一个子查询组;

若是,则根据子查询组所满足的查询优化条件对所述至少一个子查询组进行优化处理,得到新的子查询;

根据所述新的子查询更新所述待处理查询后,返回执行判断所述待处理查询中是否包括满足查询优化条件的至少一个子查询组的操作,直至满足结束优化条件;

将最近一次更新的所述待处理查询,作为所述备选优化查询。

10.根据权利要求9所述的计算机设备,其特征在于,所述处理器是设置为通过以下方式判断所述待处理查询中是否包括满足查询优化条件的至少一个子查询组:对所述待处理查询中各个子查询进行查询语句的解析,得到与各所述子查询分别对应的比对参数集合、非幂等调用方法的包含属性以及聚合函数的归约属性,所述比对参数集合中包括:列参数属性、查询数据表属性以及数据过滤条件;

如果至少两个第一目标子查询的比对参数集合之间仅列参数属性不同,且各所述第一目标子查询的非幂等调用方法的包含属性均为否,则将所述至少两个第一目标子查询加入至满足重复查询优化条件的子查询组中;

如果至少两个第二目标子查询的比对参数集合中查询数据表属性相同,列参数属性相同或不全相同,且数据过滤条件不同,每个所述第二目标子查询包括的聚合函数的归约属性为是,则将所述第二目标子查询加入至满足分段查询优化条件的子查询组中。

11.根据权利要求10所述的计算机设备,其特征在于,所述处理器是设置为通过以下方式得到新的子查询:在每个所述满足重复查询优化条件的子查询组中,按照列参数属性,将包括的至少两个第一目标子查询进行合并,得到新的子查询;和/或在每个所述满足分段查询优化条件的子查询组中,按照所述满足分段查询优化条件的子查询组匹配的数据过滤条件,将包括的至少两个第二目标子查询进行合并,并确定每个所述第二目标子查询的聚合函数关联的至少一个归约函数,生成公共子查询,以及指定所述公共子查询的查询结果的存储地址;

根据每个所述第二目标子查询的列参数属性包括的聚合函数与所述公共子查询中关联的至少一个所述归约函数的计算关系,所述数据过滤条件以及所述存储地址,生成所述第二目标子查询匹配的优化子查询;

将所述公共子查询与至少一个所述优化子查询均作为新的子查询。

12.根据权利要求8所述的计算机设备,其特征在于,所述处理器是设置为通过以下方式对所述备选优化查询进行代价评估:计算所述备选优化查询中各子查询执行的第一代价评估值;

计算所述备选优化查询的子查询结果存储的第二代价评估值;

计算所述备选优化查询中子查询补充修改的第三代价评估值;

将所述第一代价评估值、所述第二代价评估值和所述第三代价评估值的相加结果作为所述备选优化查询的修改代价评估值。

13.根据权利要求12所述的计算机设备,其特征在于,所述处理器是设置为通过以下方式确定所述备选优化查询的代价评估结果优于所述待处理查询的代价评估结果:当所述待处理查询的初始代价评估值与预设调整系数的乘积大于所述备选优化查询的修改代价评估值时,确定所述备选优化查询的代价评估结果优于所述待处理查询的代价评估结果。

14.根据权利要求8所述的计算机设备,其特征在于,所述处理器还设置为:

根据历史待处理查询的初始代价评估值、历史备选优化查询的修改代价评估值、历史待处理查询的初始运行时间和历史备选优化查询的修改运行时间,修正预设调整系数。

15.一种存储介质,所述存储介质用于存储指令,所述指令用于执行如权利要求1-7中任一所述的查询语句优化方法。

说明书 :

查询语句优化方法、装置、计算机设备及存储介质

技术领域

[0001] 本发明实施例涉及数据库查询领域,尤其涉及一种查询语句优化方法、装置、计算机设备及存储介质。

背景技术

[0002] 数据库可以提供数据查询功能。随着大数据时代的到来,数据库中存储的数据越来越多,查询占用的资源也越来越多。
[0003] 在数据库查询中,可以通过在一个查询中嵌套多个子查询实现更多查询和计算功能,直接得到最终需要的结果。但在一个包含多个子查询的查询中,不同子查询实际上做了部分重叠的工作,这些工作例如是指该查询中存在重复的扫表工作或者是重复的计算工作。通常,这些重复的计算和扫表通常会占用更多的资源,导致查询的整体性能下降。特别是在大数据场景中,子查询中会包含大量连接(join)和/或聚合等,导致子查询非常耗时。甚至在一些复杂的分析型场景中,经常存在部分子查询或全部子查询都是重复计算。
[0004] 目前,可以使用with as语句优化查询,with as语句是将用到的子查询的查询结果事先提取出来存入临时表,使整个查询当中的所有模块都可以调用该查询结果,可以避免对相同子查询的重复计算工作。但该方法缺点是需要手动改写查询语句,无法自动识别和生成;而且由于with as使用临时表进行存储,同样占用资源,从而不能保证with as一定提升查询性能。

发明内容

[0005] 本发明实施例提供了一种查询语句优化方法、装置、计算机设备及存储介质,可以优化查询,提高查询效率,降低查询成本,极大的提升查询性能。
[0006] 第一方面,本发明实施例提供了一种查询语句优化方法,包括:
[0007] 在检测到查询优化请求时,获取所述查询优化请求指向的待处理查询,所述待处理查询中包括多个子查询;
[0008] 采用预设的查询优化规则,逐级对所述待处理查询中包括的满足查询优化条件的子查询组进行优化处理,得到与所述待处理查询对应的备选优化查询,所述子查询组中包括至少两个子查询;
[0009] 分别对所述待处理查询和所述备选优化查询进行代价评估;
[0010] 如果将所述备选优化查询的代价评估结果与所述待处理查询的代价评估结果进行比较,确定所述备选优化查询的代价评估结果优于所述待处理查询的代价评估结果,则将所述备选优化查询作为所述待处理查询的优化结果,以使所述备选优化查询替换所述待处理查询进行数据查询。
[0011] 第二方面,本发明实施例提供了一种查询语句优化装置,包括:
[0012] 待处理查询获取模块,用于在检测到查询优化请求时,获取所述查询优化请求指向的待处理查询,所述待处理查询中包括多个子查询;
[0013] 待处理查询逐级优化模块,用于采用预设的查询优化规则,逐级对所述待处理查询中包括的满足查询优化条件的子查询组进行优化处理,得到与所述待处理查询对应的备选优化查询,所述子查询组中包括至少两个子查询;
[0014] 优化代价评估模块,用于分别对所述待处理查询和所述备选优化查询进行代价评估;
[0015] 优化替换模块,用于如果将所述备选优化查询的代价评估结果与所述待处理查询的代价评估结果进行比较,确定所述备选优化查询的代价评估结果优于所述待处理查询的代价评估结果,则将所述备选优化查询作为所述待处理查询的优化结果,以使所述备选优化查询替换所述待处理查询进行数据查询。
[0016] 第三方面,本发明实施例还提供了一种计算机设备包括处理器和存储器,所述存储器用于存储指令,当所述指令执行时使得所述处理器执行以下操作:
[0017] 在检测到查询优化请求时,获取所述查询优化请求指向的待处理查询,所述待处理查询中包括多个子查询;
[0018] 采用预设的查询优化规则,逐级对所述待处理查询中包括的满足查询优化条件的子查询组进行优化处理,得到与所述待处理查询对应的备选优化查询,所述子查询组中包括至少两个子查询;
[0019] 分别对所述待处理查询和所述备选优化查询进行代价评估;
[0020] 如果将所述备选优化查询的代价评估结果与所述待处理查询的代价评估结果进行比较,确定所述备选优化查询的代价评估结果优于所述待处理查询的代价评估结果,则将所述备选优化查询作为所述待处理查询的优化结果,以使所述备选优化查询替换所述待处理查询进行数据查询。
[0021] 第四方面,本发明实施例还提供了一种存储介质,存储介质用于存储指令,指令用于执行:
[0022] 在检测到查询优化请求时,获取所述查询优化请求指向的待处理查询,所述待处理查询中包括多个子查询;
[0023] 采用预设的查询优化规则,逐级对所述待处理查询中包括的满足查询优化条件的子查询组进行优化处理,得到与所述待处理查询对应的备选优化查询,所述子查询组中包括至少两个子查询;
[0024] 分别对所述待处理查询和所述备选优化查询进行代价评估;
[0025] 如果将所述备选优化查询的代价评估结果与所述待处理查询的代价评估结果进行比较,确定所述备选优化查询的代价评估结果优于所述待处理查询的代价评估结果,则将所述备选优化查询作为所述待处理查询的优化结果,以使所述备选优化查询替换所述待处理查询进行数据查询。
[0026] 本发明实施例通过对子查询进行逐级优化,生成备选优化查询,实现自动优化查询,并在备选优化查询的代价优于待处理查询的代价时,备选优化查询替换待处理查询进行数据查询,实现评估优化后的查询性能,以及在查询性能提高时使用备选优化查询,解决了现有技术中人工改写查询语句而且无法保证改写后的查询一定能提升查询性能的问题,可以实现减少人工成本,提高查询优化效率,同时还可以保留真正提升查询性能的备选优化查询,提高查询优化的质量。

附图说明

[0027] 图1a是本发明实施例一中的一种查询语句优化方法的流程图;
[0028] 图1b是本发明实施例一中的一种查询语句优化方法的流程图;
[0029] 图2是本发明实施例二中的一种查询语句优化方法的流程图;
[0030] 图3a是本发明实施例三中的一种查询语句优化方法的流程图;
[0031] 图3b是本发明实施例三中的一种查询语句优化方法的流程图;
[0032] 图4是本发明实施例四中的一种查询语句优化装置的结构示意图;
[0033] 图5是本发明实施例五中的一种计算机设备的结构示意图。

具体实施方式

[0034] 下面结合附图和实施例对本发明作进一步的详细说明。可以理解的是,此处所描述的具体实施例仅仅用于解释本发明,而非对本发明的限定。另外还需要说明的是,为了便于描述,附图中仅示出了与本发明相关的部分而非全部结构。
[0035] 为了便于理解,优先对本发明实施例中的技术术语进行说明:
[0036] 其中,查询用于在数据库中获取需要的数据,具体可以包括多个子查询,每个子查询均包括查询内容、查询数据表以及数据过滤条件等。其中,查询内容用于作为查询依据从数据库中进行查询,示例性的,查询内容包括查询的字段和/或别名等。查询数据表用于存储数据,并作为查询范围,查询实际是在查询数据表中进行查询。数据过滤条件用于作为查询条件筛选查询数据,示例性的,数据过滤条件为年龄小于20的男人。
[0037] 示例性的,一个子查询如下所示:
[0038] SELECT c_name(查询内容)
[0039] FROM table_c(查询数据表名)
[0040] WHERE c_age<20(数据过滤条件)
[0041] 具体的,该子查询用于在查询数据表table_c中查询符合年龄小于20(c_age<20)的人的姓名c_name。
[0042] 查询优化规则用于识别查询中的可优化的子查询以及进行相应的优化处理。查询优化条件用于判断查询中是否存在由至少两个可优化的子查询形成的子查询组。示例性的,查询优化条件限定子查询组中至少两个子查询的共同特征,如,至少两个子查询仅查询内容不同,其他内容均相同。
[0043] 优化处理用于将待处理查询修改为性能更好的查询,节省查询所需的资源,同时提高查询的查询效率。
[0044] 备选优化查询可以是指该待处理查询经过逐级优化完成,且无法再进一步进行优化的查询,用于作为待处理查询的一个优化结果。
[0045] 子查询组可以是指优化处理的最小单元。
[0046] 代价评估用于评价执行一个查询所需的代价。
[0047] 代价评估结果用于评价执行查询耗费的代价,以及用于评价查询的查询性能。
[0048] 比对参数集合用于存储子查询的特征参数,以及用于描述子查询的特征。
[0049] 幂等具体是指不论查询重复执行多少次,每次的执行结果均相同。非幂等具体是指,查询重复执行,每次的执行结果不全相同。
[0050] 非幂等调用方法用于调用重复执行无法得到相同结果的函数,示例性的,rand函数产生指定范围内的随机整数。
[0051] 聚合函数可以是指对一组值执行计算并返回单个值的函数。
[0052] 归约可以是指一个聚合函数的计算可以转换为其他聚合函数的计算。
[0053] 聚合函数表示为对设定数据集中的各数值执行聚合(也可以成为计算),并返回单个值。
[0054] 聚合函数的归约属性为是,可以是指将聚合函数对应的计算过程中关联的待聚合的数据集按照任意方式分成多组,在每种分组方式下,先计算组内聚合的初始结果,再计算各组聚合的最终结果。每种分组方式得到的最终结果均与对数据集直接聚合得到的结果相同。用数学化的语言来描述:例如,聚合函数G是对数据集A进行聚合运算。聚合函数G的归约属性为是,是指:将数据集A以任意划分方式划分成若干子集{A1,A2……AN}满足:A1∪A2∪……∪AN=A, 以及G(A)=G({G(A1),G(A2)……G(AN)})。示例性的,函数SUM用于求和计算。数据集A包括{1,2,3,4,5,6},总共6个数值,可以将6个数值划分为3组,如,A1={1,2},A2={3,4},A3={5,6}每组包含2个数值,采用函数SUM分别对3组进行聚合,得到3个初始结果,即SUM(A1)=3,SUM(A2)=7,SUM(A3)=11。再次函数SUM对3组聚合得到的初始结果进行聚合,得到最终结果SUM({SUM(A1),SUM(A2),SUM(A3)})=21,与SUM(A)=SUM(1,2,3,4,5,6)=21的结果相同。由此,SUM的可归约属性为是。同样,聚合函数COUNT的可归约属性为是。此外,若聚合函数可以转化为多个可归约的聚合函数的运算,该聚合函数的归约属性确定为是。示例性的,聚合函数AVG可以转化为聚合函数SUM与聚合函数COUNT的比值,也即聚合函数AVG可以转化为可归约的聚合函数SUM与可归约的聚合函数COUNT的运算,由此,函数AVG的可归约属性为是。
[0055] 在比对参数集合中,列参数属性用于描述查询内容的特征,示例性的,列参数属性包括查询字段名称、聚合函数的名称和聚合函数的属性。
[0056] 查询数据表属性用于确定查询数据表,示例性的,查询数据表属性包括查询数据表的名称。
[0057] 第一目标子查询可以是指代处理查询中各子查询中的任意一个子查询;将满足重复查询优化条件的多个第一目标子查询加入同一个子查询组中,该子查询组中的子查询作为重复子查询。
[0058] 重复查询优化条件用于判断子查询组的至少两个子查询是否为重复子查询。重复子查询可以是指查询内容不完全相同,其他均相同的子查询。示例性的,若子查询A的查询内容包括对字段a和字段b的查询,子查询B的查询内容包括对字段a的查询,此外,子查询A的其他内容和子查询B的其他内容均相同,此时,子查询A的查询内容和子查询B的查询内容不完全相同,其他内容均相同,子查询A和子查询B确定为重复子查询。
[0059] 第二目标子查询可以是指代处理查询中各子查询中的任意一个子查询,将满足分段查询优化条件的多个第二目标子查询加入同一个子查询组中,该子查询组中的子查询作为分段子查询。
[0060] 分段查询优化条件用于判断子查询组的至少两个子查询是否为分段子查询。分段子查询可以是指查询数据表属性相同或不全相同,数据过滤条件不同,查询内容相似的子查询。
[0061] 公共子查询用于查询各第二目标子查询筛选出的公共结果,并将该公共结果存储在预设的存储地址,该公共结果可以是第二目标子查询的查询结果,也可以是第二目标子查询的查询结果关联的中间结果,示例性的,第二目标子查询的查询结果为AVG(v1)的值,关联的中间结果包括COUNT(v1)和SUM(v1)。
[0062] 存储地址用于指向存储公共子查询的查询结果,例如,存储地址指向中间查询数据表。
[0063] 结束优化条件用于判断逐级优化是否完成,以及是否能够进一步进行优化的查询。
[0064] 第一代价评估值用于评价执行子查询耗费的代价,也即是子查询本身的代价。
[0065] 第二代价评估值用于评价子查询写入外部存储的代价,也即是子查询的存储代价。
[0066] 第三代价评估值用于评价子查询关联的补充的子查询的执行代价,也即前述额外补充的修改后的子查询的执行代价。
[0067] 调整系数用于调整基于代价的优化(Cost-Based Optimization,CBO)的评价结果,减少评估偏差。
[0068] 历史待处理查询和历史备选优化查询均用于确定调整系数。历史备选优化查询可以是指历史待处理查询经过优化处理的查询。
[0069] 初始运行时间用于作为历史待处理查询的代价评估值,修改运行时间用于作为历史备选优化查询的代价评估值。
[0070] 实施例一
[0071] 图1a为本发明实施例一中的一种查询语句优化方法的流程图,本实施例可适用于将自动优化查询语句的情况,该方法可以由本发明实施例提供的查询语句优化装置来执行,该装置可采用软件和/或硬件的方式实现,并一般可集成电子设备中,例如,终端设备或服务器等。如图1a所示,本实施例的方法具体包括:
[0072] 步骤110,在检测到查询优化请求时,获取所述查询优化请求指向的待处理查询,所述待处理查询中包括多个子查询。
[0073] 查询优化请求用于获取待处理查询并进行优化处理。通常,查询优化请求中包括待处理查询的存储地址。该存储地址用于指向待处理查询,以便获取待处理查询。处理器或其他模块可以在采用待处理查询进行查询之前,生成查询优化请求,以对待处理查询进行优化处理。或者,在未采用待处理查询进行查询时,生成查询优化请求,以对待处理查询进行优化处理。
[0074] 查询用于在数据库中获取需要的数据,具体可以包括多个子查询,每个子查询均包括查询内容、查询数据表以及数据过滤条件等。其中,查询内容用于作为查询依据从数据库中进行查询,示例性的,查询内容包括查询的字段和/或别名等。查询数据表用于存储数据,并作为查询范围,查询实际是在查询数据表中进行查询。数据过滤条件用于作为查询条件筛选查询数据,示例性的,数据过滤条件为年龄小于20的男人。
[0075] 示例性的,一个子查询如下所示:
[0076] SELECT c_name(查询内容)
[0077] FROM table_c(查询数据表名)
[0078] WHERE c_age<20(数据过滤条件)
[0079] 具体的,该子查询用于在查询数据表table_c中查询符合年龄小于20(c_age<20)的人的姓名c_name。
[0080] 实际上,每个子查询用于查询一个独立的查询内容,一个查询包括多个子查询,用于查询多个查询内容,同时,每个子查询中的查询内容、查询数据表以及数据过滤条件可以均不相同。
[0081] 步骤120,采用预设的查询优化规则,逐级对所述待处理查询中包括的满足查询优化条件的子查询组进行优化处理,得到与所述待处理查询对应的备选优化查询,所述子查询组中包括至少两个子查询。
[0082] 查询优化规则用于识别查询中的可优化的子查询以及进行相应的优化处理。查询优化条件用于判断查询中是否存在由至少两个可优化的子查询形成的子查询组。示例性的,查询优化条件限定子查询组中至少两个子查询的共同特征,如,至少两个子查询仅查询内容不同,其他内容均相同。
[0083] 优化处理用于将待处理查询修改为性能更好的查询,节省查询所需的资源,同时提高查询的查询效率。其中,优化处理可以是直接在原查询语句中进行修改,也可以是在执行计划中进行修改,只要保证查询结果相同即可。示例性的,可以采用基于物化实例的优化器(Materialization Based Optimizer,MBO)进行改写优化。其中,物化实例指将查询结果预先物化到为表或物化视图,如果有查询可以在已有的物化实例上直接取结果,MBO则负责将原始查询改为对物化实例的查询,实现高效的查询和数据提取,提高查询性能。
[0084] 子查询组可以是指优化处理的最小单元。备选优化查询可以是指该待处理查询经过逐级优化完成,且无法再进一步进行优化的查询,用于作为待处理查询的一个优化结果。
[0085] 可选的,所述采用预设的查询优化规则,逐级对所述待处理查询中包括的满足查询优化条件的子查询组进行优化处理,得到与所述待处理查询对应的备选优化查询,包括:判断所述待处理查询中是否包括满足查询优化条件的至少一个子查询组;若是,则根据子查询组所满足的查询优化条件对所述至少一个子查询组进行优化处理,得到新的子查询;
根据所述新的子查询更新所述待处理查询后,返回执行判断所述待处理查询中是否包括满足查询优化条件的至少一个子查询组的操作,直至满足结束优化条件;将最近一次更新的所述待处理查询,作为所述备选优化查询。
[0086] 可选的,所述判断所述待处理查询中是否包括满足查询优化条件的至少一个子查询组,包括:对所述待处理查询中各个子查询进行查询语句的解析,得到与各所述子查询分别对应的比对参数集合、非幂等调用方法的包含属性以及聚合函数的归约属性,所述比对参数集合中包括:列参数属性、查询数据表属性以及数据过滤条件;如果至少两个第一目标子查询的比对参数集合之间仅列参数属性不同,且各所述第一目标子查询的非幂等调用方法的包含属性均为否,则将所述至少两个第一目标子查询加入至满足重复查询优化条件的子查询组中;如果至少两个第二目标子查询的比对参数集合中查询数据表属性相同,列参数属性相同或不全相同,且数据过滤条件不同,每个所述第二目标子查询包括的聚合函数的归约属性为是,则将所述第二目标子查询加入至满足分段查询优化条件的子查询组中。
[0087] 可选的,所述根据子查询组所满足的查询优化条件对所述至少一个子查询组进行优化处理,得到新的子查询,包括:在每个所述满足重复查询优化条件的子查询组中,按照列参数属性,将包括的至少两个第一目标子查询进行合并,得到新的子查询;和/或在每个所述满足分段查询优化条件的子查询组中,按照所述满足分段查询优化条件的子查询组匹配的数据过滤条件,将包括的至少两个第二目标子查询进行合并,并确定每个所述第二目标子查询的聚合函数关联的至少一个归约函数,生成公共子查询,以及指定所述公共子查询的查询结果的存储地址;根据每个所述第二目标子查询的列参数属性包括的聚合函数与所述公共子查询中关联的至少一个所述归约函数的计算关系,所述数据过滤条件以及所述存储地址,生成所述第二目标子查询匹配的优化子查询;将所述公共子查询与至少一个所述优化子查询均作为新的子查询。
[0088] 步骤130,分别对所述待处理查询和所述备选优化查询进行代价评估。
[0089] 代价评估用于评价执行一个查询所需的代价,具体可以包括下述至少一项:时间代价、空间代价、资源代价和准确性等。示例性的,代价评估可以是指评估执行一个查询所耗费的资源的量化值,通常,耗费的资源包括下述至少一项:输入输出代价、中央处理器代价和网络代价等。输入输出代价可以是指将数据从磁盘读入内存时所需要的代价。中央处理器代价可以是指处理(如排序)内存中数据所需的代价。网络代价可以是指访问远程节点的代价。
[0090] 具体的,代价评估可以通过代价引擎分别估计待处理查询和备选优化查询。
[0091] 可选的,所述对所述备选优化查询进行代价评估,包括:计算所述备选优化查询中各子查询执行的第一代价评估值;计算所述备选优化查询的子查询结果存储的第二代价评估值;计算所述备选优化查询中子查询补充修改的第三代价评估值;将所述第一代价评估值、所述第二代价评估值和所述第三代价评估值的相加结果作为所述备选优化查询的修改代价评估值。
[0092] 步骤140,如果将所述备选优化查询的代价评估结果与所述待处理查询的代价评估结果进行比较,确定所述备选优化查询的代价评估结果优于所述待处理查询的代价评估结果,则将所述备选优化查询作为所述待处理查询的优化结果,以使所述备选优化查询替换所述待处理查询进行数据查询。
[0093] 其中,代价评估结果用于评价执行查询耗费的代价,以及用于评价查询的查询性能。
[0094] 具体的,备选优化查询的代价评估结果优于待处理查询的代价评估结果,表明备选优化查询的代价小于待处理查询的代价,也即备选优化查询的查询性能高于待处理查询的查询性能,可以使用备选优化查询替换该待处理查询进行查询。
[0095] 可选的,所述确定所述备选优化查询的代价评估结果优于所述待处理查询的代价评估结果,包括:当所述待处理查询的初始代价评估值与预设调整系数的乘积大于所述备选优化查询的修改代价评估值时,确定所述备选优化查询的代价评估结果优于所述待处理查询的代价评估结果。
[0096] 可选的,在确定所述备选优化查询的代价评估结果优于所述待处理查询的代价评估结果之前,还包括:根据历史待处理查询的初始代价评估值、历史备选优化查询的修改代价评估值、历史待处理查询的初始运行时间和历史备选优化查询的修改运行时间,修正所述预设调整系数。
[0097] 可选的,如果确定备选优化查询的代价评估结果差于或同于待处理查询的代价评估结果,则使用待处理查询进行数据查询或者采用其他查询优化规则重新对待处理查询进行优化,以得到其他备选优化查询。
[0098] 具体的,备选优化查询的代价评估结果差于或同于待处理查询的代价评估结果,表明备选优化查询的代价大于或等于待处理查询的代价,也即备选优化查询的查询性能并未得到提升,可以继续使用该待处理查询进行查询或者采用其他查询优化规则重新获取备选优化查询进行评估。
[0099] 在一个具体的例子中,如图1b所示,执行查询语句的方法具体可以包括:
[0100] 步骤151,获取待处理查询语句。
[0101] 步骤152,对所述待处理查询语句进行分析。
[0102] 步骤153,判断是否存在满足查询优化条件的子查询组,如果是,则执行步骤154,否则,执行步骤156。
[0103] 步骤154,判断改写后的查询的查询性能是否提升,如果是,则执行步骤155,否则,执行步骤156。
[0104] 步骤155,保留改写后的查询。
[0105] 步骤156,执行查询。
[0106] 本发明实施例通过对子查询进行逐级优化,生成备选优化查询,实现自动优化查询,并在备选优化查询的代价优于待处理查询的代价时,备选优化查询替换待处理查询进行数据查询,实现评估优化后的查询性能,以及在查询性能提高时使用备选优化查询,解决了现有技术中人工改写查询语句而且无法保证改写后的查询一定能提升查询性能的问题,可以实现减少人工成本,提高查询优化效率,同时还可以保留真正提升查询性能的备选优化查询,提高查询优化的质量。
[0107] 实施例二
[0108] 图2为本发明实施例二中的一种查询语句优化方法的流程图,本实施例以上述实施例为基础进行具体化,将采用预设的查询优化规则,逐级对所述待处理查询中包括的满足查询优化条件的子查询组进行优化处理,得到与所述待处理查询对应的备选优化查询,具体化为:判断所述待处理查询中是否包括满足查询优化条件的至少一个子查询组;若是,则根据子查询组所满足的查询优化条件对所述至少一个子查询组进行优化处理,得到新的子查询;根据所述新的子查询更新所述待处理查询后,返回执行判断所述待处理查询中是否包括满足查询优化条件的至少一个子查询组的操作,直至满足结束优化条件;将最近一次更新的所述待处理查询,作为所述备选优化查询。
[0109] 如图2所示,本实施例的方法具体包括:
[0110] 步骤201,在检测到查询优化请求时,获取所述查询优化请求指向的待处理查询,所述待处理查询中包括多个子查询。
[0111] 本实施例中待处理查询、子查询、子查询组、查询优化条件、代价评估和备选优化查询等可以参考上述实施例的描述。
[0112] 步骤202,判断所述待处理查询中是否包括满足查询优化条件的至少一个子查询组。
[0113] 可选的,所述判断所述待处理查询中是否包括满足查询优化条件的至少一个子查询组,包括:对所述待处理查询中各个子查询进行查询语句的解析,得到与各所述子查询分别对应的比对参数集合、非幂等调用方法的包含属性以及聚合函数的归约属性,所述比对参数集合中包括:列参数属性、查询数据表属性以及数据过滤条件;如果至少两个第一目标子查询的比对参数集合之间仅列参数属性不同,且各所述第一目标子查询的非幂等调用方法的包含属性均为否,则将所述至少两个第一目标子查询加入至满足重复查询优化条件的子查询组中;如果至少两个第二目标子查询的比对参数集合中查询数据表属性相同或不全相同,数据过滤条件不同,且每个所述第二目标子查询包括的聚合函数的归约属性为是,则将所述至少两个第二目标子查询加入至满足分段查询优化条件的子查询组中。
[0114] 具体的,第一目标子查询可以是指代处理查询中各子查询中的任意一个子查询;第二目标子查询可以是指代处理查询中各子查询中的任意一个子查询。
[0115] 将满足重复查询优化条件的多个第一目标子查询加入同一个子查询组中,该子查询组中的子查询作为重复子查询,可以进行合并优化。
[0116] 将满足分段查询优化条件的多个第二目标子查询加入同一个子查询组中,该子查询组中的子查询作为分段子查询,可以进行合并优化。
[0117] 需要说明的是,子查询的优化是指在子查询组的组内优化,不同子查询组之间不能进行优化。在子查询组的组内优化结束后,可以对得到的新的子查询进行判断,得到多组新的子查询组,并继续执行组内优化,直到无法得到新的子查询组,优化结束。
[0118] 比对参数集合用于存储子查询的特征参数,以及用于描述子查询的特征。幂等具体是指不论查询重复执行多少次,每次的执行结果均相同。非幂等具体是指,查询重复执行,每次的执行结果不全相同。从而非幂等调用方法用于调用重复执行无法得到相同结果的函数,示例性的,rand函数产生指定范围内的随机整数。聚合函数可以是指对一组值执行计算并返回单个值的函数。归约可以是指一个聚合函数的计算可以转换为其他聚合函数的计算。
[0119] 聚合函数表示为对设定数据集中的各数值执行聚合(也可以成为计算),并返回单个值。
[0120] 聚合函数的归约属性为是,可以是指将聚合函数对应的计算过程中关联的待聚合的数据集按照任意方式分成多组,在每种分组方式下,先计算组内聚合的初始结果,再计算各组聚合的最终结果。每种分组方式得到的最终结果均与对数据集直接聚合得到的结果相同。用数学化的语言来描述:例如,聚合函数G是对数据集A进行聚合运算。聚合函数G的归约属性为是,是指:将数据集A以任意划分方式划分成若干子集{A1,A2……AN}满足:A1∪A2∪……∪AN=A, 以及G(A)=G({G(A1),G(A2)……G(AN)})。示例性的,函数SUM用于求和计算。数据集A包括{1,2,3,4,5,6},总共6个数值,可以将6个数值划分为3组,如,A1={1,2},A2={3,4},A3={5,6}每组包含2个数值,采用函数SUM分别对3组进行聚合,得到3个初始结果,即SUM(A1)=3,SUM(A2)=7,SUM(A3)=11。再次函数SUM对3组聚合得到的初始结果进行聚合,得到最终结果SUM({SUM(A1),SUM(A2),SUM(A3)})=21,与SUM(A)=SUM(1,2,3,4,5,6)=21的结果相同。由此,SUM的可归约属性为是。同样,聚合函数COUNT的可归约属性为是。此外,若聚合函数可以转化为多个可归约的聚合函数的运算,该聚合函数的归约属性确定为是。示例性的,聚合函数AVG可以转化为聚合函数SUM与聚合函数COUNT的比值,也即聚合函数AVG可以转化为可归约的聚合函数SUM与可归约的聚合函数COUNT的运算,由此,函数AVG的可归约属性为是。
[0121] 在比对参数集合中,列参数属性用于描述查询内容的特征,示例性的,列参数属性包括查询字段名称、聚合函数的名称和聚合函数的属性。查询数据表属性用于确定查询数据表,示例性的,查询数据表属性包括查询数据表的名称。
[0122] 具体的,重复查询优化条件用于判断子查询组的至少两个子查询是否为重复子查询。重复子查询可以是指查询内容不完全相同,其他均相同的子查询。至少两个第一目标子查询的比对参数集合之间仅列参数属性不同,且各所述第一目标子查询的非幂等调用方法的包含属性均为否,表明至少两个第一目标子查询仅仅是查询内容不同,而且每个第一目标子查询重复执行对应的每次执行结果均相同。此时,至少两个第一目标子查询实际为重复子查询,可以针对查询内容进行合并。
[0123] 在一个具体的例子中,子查询组A如下所示:
[0124]
[0125]
[0126] 其中,子查询组A包括三个第一目标子查询,其查询数据表为table1,过滤条件为1-30分钟,对应的查询内容分别为COUNT(*)、AVG(v1)和AVG(v2),且均不包括非幂等调用方法。
[0127] 如果至少两个第二目标子查询的比对参数集合中查询数据表属性相同或不全相同,数据过滤条件不同,且每个所述第二目标子查询包括的聚合函数的归约属性为是,则将所述至少两个第二目标子查询加入至满足分段查询优化条件的子查询组中。
[0128] 具体的,分段查询优化条件用于判断子查询组的至少两个子查询是否为分段子查询。分段子查询可以是指查询数据表属性相同或不全相同,数据过滤条件不同,查询内容相似的子查询。至少两个第二目标子查询的比对参数集合中查询数据表属性相同或不全相同,即表明至少两个第二目标子查询至少在同一个查询数据表中进行查询,此时,至少两个第二目标子查询实际为分段子查询,可以针对数据过滤条件进行合并。
[0129] 具体的,不全相同是指查询数据表属性部分重叠。示例性的,一个第二目标子查询的查询数据表包括表a,另一个第二目标子查询的查询数据表表a和表b,此时,这两个第二目标子查询的查询数据表均包括表a,也即两个第二目标子查询均在表a中进行查询,由此,两个第二目标子查询的查询数据表属性不全相同。
[0130] 若第二目标子查询包括聚合函数,该聚合函数为可归约的聚合函数,或者可以转换为其他聚合函数的计算的聚合函数;若至少两个第二目标子查询均不包括聚合函数,可以仅根据查询数据表属性判断子查询是否为满足分段查询优化条件。此外,若至少一个子查询中包括聚合函数,但归约属性为否,则至少一个子查询不是分段子查询,不能加入至满足分段查询优化条件的子查询组中。
[0131] 此外,第二目标子查询可以不包括聚合函数。若第二目标子查询包括聚合函数,该聚合函数必须为可归约的聚合函数,才可能被归类到分段子查询。
[0132] 需要说明的是,还需要判断第二目标子查询的查询内容满足相似条件,示例性的,查询内容中部分字段名称相同。
[0133] 在一个具体的例子中,子查询组B如下所示:
[0134]
[0135]
[0136] 其中,子查询组B包括两个第二目标子查询,其查询内容为COUNT(*),查询数据表为table1,对应的过滤条件分别为1-30分钟、31-60分钟,且COUNT(*)函数为可归约函数。
[0137] 通过配置重复查询优化条件筛选出重复子查询形成子查询组,以及配置分段查询优化条件筛选出分段子查询形成子查询组,可以准确确定各子查询组的子查询的类型,以准确确定子查询组的优化方式,提高子查询组的优化质量。
[0138] 步骤203,若是,则根据子查询组所满足的查询优化条件对所述至少一个子查询组进行优化处理,得到新的子查询。
[0139] 对至少一个子查询组进行优化,可以得到至少一个新的子查询。
[0140] 具体的,查询优化条件包括不同的具体优化条件,可以具体根据子查询组满足的查询优化条件,选择对应的优化方式进行优化处理。
[0141] 可选的,所述根据子查询组所满足的查询优化条件对所述至少一个子查询组进行优化处理,得到新的子查询,包括:在每个所述满足重复查询优化条件的子查询组中,按照列参数属性,将包括的至少两个第一目标子查询进行合并,得到新的子查询;和/或在每个所述满足分段查询优化条件的子查询组中,按照所述满足分段查询优化条件的子查询组匹配的数据过滤条件,将包括的至少两个第二目标子查询进行合并,并确定每个所述第二目标子查询的聚合函数关联的至少一个归约函数,生成公共子查询,以及指定所述公共子查询的查询结果的存储地址;根据每个所述第二目标子查询的列参数属性包括的聚合函数与所述公共子查询中关联的至少一个所述归约函数的计算关系,所述数据过滤条件以及所述存储地址,生成所述第二目标子查询匹配的优化子查询;将所述公共子查询与至少一个所述优化子查询均作为新的子查询。
[0142] 针对满足重复查询优化条件的子查询组,可以保留一个第一目标子查询,并在该第一目标子查询中添加其他第一目标子查询的列参数属性,生成新的子查询,示例性,如前例,在子查询组A中,新的子查询如下所示:
[0143] SELECT COUNT(*),AVG(v1),AVG(v2)
[0144] FROM table1
[0145] WHERE time_minutes BETWEEN 1AND 30
[0146] 具体的,新的子查询组A包括一个子查询,其查询数据表为table1,过滤条件为1-30分钟,查询内容包括COUNT(*)、AVG(v1)和AVG(v2)。
[0147] 针对满足分段查询优化条件的子查询组,可以针对数据过滤条件进行查询合并。其中,由于满足分段查询优化条件的子查询组中的各子查询对应的数据过滤条件均不相同,满足分段查询优化条件的子查询组匹配的数据过滤条件可以是指,该子查询组中包括的各子查询分别对应的数据过滤条件。示例性的,满足分段查询优化条件的子查询组包括三个子查询,匹配的数据过滤条件的数目为3个,分别是这三个子查询分别对应的数据过滤条件。
[0148] 若该子查询组中并不包括任何聚合函数,可以针对合并的数据过滤条件,生成公共子查询,用于查询并生成中间结果,并存入预设的中间查询数据表中。同时再添加与各第二目标子查询对应的优化子查询,用于分别在从中间查询数据表中进行查询,获取匹配的中间结果进行处理,以获取与对应的第二目标子查询的查询结果相同的查询结果。
[0149] 其中,公共子查询用于查询各第二目标子查询筛选出的公共结果,并将该公共结果存储在预设的存储地址,该公共结果可以是第二目标子查询的查询结果,也可以是第二目标子查询的查询结果关联的中间结果,示例性的,第二目标子查询的查询结果为AVG(v1)的值,关联的中间结果包括COUNT(v1)和SUM(v1)。存储地址用于指向存储公共子查询的查询结果,例如,存储地址指向中间查询数据表。此外,获取公共结果的方式可以是通过表查询的方式,可以是通过物化视图,或者还可以是通过with as语句,对此,本发明实施例不作具体限制。
[0150] 示例性,如前例,在子查询组B中,新的子查询如下所示:
[0151] CREATE TABLE tmp_table AS
[0152] SELECT time_minutes,COUNT(*)count
[0153] FROM table1
[0154] GROUP BY time_minutes;
[0155] 以及
[0156]
[0157] 具体的,新的子查询组B包括三个子查询,第一个子查询用于将查询数据表为table1,过滤条件为1-60分钟,查询内容包括COUNT(*)的数据作为中间数据count存储在tmp_table,第二个子查询用于在查询数据表tmp_table中查询过滤条件为1-30分钟的count数据,第三个子查询用于在查询数据表tmp_table中查询过滤条件为31-60分钟的count数据。
[0158] 另一方面,若该子查询组中包括至少一个聚合函数,且全部聚合函数的归约属性均为是,在生成的公共子查询中的查询内容中,添加聚合函数关联的归约函数。同时,可以根据聚合函数与关联的归约函数之间的计算关系,确定各优化子查询的查询内容中的至少一个归约函数的计算公式,同时,该计算公式的计算结果与匹配的第二目标子查询中聚合函数计算得到的结果相同。其中,计算关系用于确定至少一个归约函数计算得到聚合函数的计算公式。
[0159] 通过针对满足不同优化条件的子查询组分别进行相应的优化处理,提高查询优化的精准性和准确性。
[0160] 需要说明的是,子查询的改写可以在原语句上直接改写,还可以基于预设的子查询模板,将查询内容、数据查询表和数据过滤条件等填充到匹配的位置处,形成新的子查询。
[0161] 步骤204,根据所述新的子查询更新所述待处理查询后,返回执行判断所述待处理查询中是否包括满足查询优化条件的至少一个子查询组的操作,直至满足结束优化条件。
[0162] 结束优化条件用于判断逐级优化是否完成,以及是否能够进一步进行优化的查询。示例性的,结束优化条件包括待处理查询中不包括满足查询优化条件的任一子查询组。
[0163] 步骤205,将最近一次更新的所述待处理查询,作为所述备选优化查询。
[0164] 在满足结束优化条件时,当前待处理查询无法再进行优化处理,最近一次更新的待处理查询即为最新且最优化的查询,此时,可以将最近一次更新的待处理查询作为该待处理查询对应的备选优化查询。
[0165] 此外,可以采取不同的查询优化规则,分别对待处理查询进行优化处理,并生成至少一个备选优化查询。
[0166] 步骤206,分别对所述待处理查询和所述备选优化查询进行代价评估。
[0167] 该待处理查询实际是指原本未经过任何优化处理的查询。
[0168] 步骤207,如果将所述备选优化查询的代价评估结果与所述待处理查询的代价评估结果进行比较,确定所述备选优化查询的代价评估结果优于所述待处理查询的代价评估结果,则将所述备选优化查询作为所述待处理查询的优化结果,以使所述备选优化查询替换所述待处理查询进行数据查询。
[0169] 本发明实施例通过对子查询组进行优化,并在更新后的待处理查询中查询新的子查询组以进行优化,不断重复,实现对待处理查询的逐级优化,最终在满足结束优化条件时,生成备选优化查询,得到最终优化结果,加大优化力度,提高查询优化的质量。
[0170] 在一个具体的例子中,查询数据表table1存储有上百万行信息,其中,包括列属性time_minutes,对应的数据类型为int类型,数值范围为1-60。
[0171] 若待处理查询如下所示:
[0172]
[0173]
[0174] 经过检测,该查询在执行时,需要做6次百万级的扫表操作。
[0175] 其中,子查询L:
[0176] SELECT COUNT(*)
[0177] FROM table1
[0178] WHERE time_minutes BETWEEN 1AND 30
[0179] 子查询M:
[0180] SELECT AVG(v1)
[0181] FROM table1
[0182] WHERE time_minutes BETWEEN 1AND 30
[0183] 以及子查询N:
[0184] SELECT AVG(v2)
[0185] FROM table1
[0186] WHERE time_minutes BETWEEN 1AND 30
[0187] 只有select位置处(即查询内容)的字段不同,其他完全相同,属于重复子查询。由此,子查询L、子查询M和子查询N形成的子查询组可以合并为新的子查询:
[0188] SELECT COUNT(*),AVG(v1),AVG(v2)
[0189] FROM table1
[0190] WHERE time_minutes BETWEEN 1AND 30
[0191] 从而,将3次百万级的扫表操作合并成了1次,避免了大量的读表和反序列化操作。
[0192] 同前,对后续三个子查询进行同样的合并处理。这样,将6次百万级的扫表操作。减少到了2次百万级的扫操作。
[0193] 此时,合并后的新的子查询为:
[0194] SELECT COUNT(*),AVG(v1),AVG(v2)
[0195] FROM table1
[0196] WHERE time_minutes BETWEEN 1AND 30
[0197] 和
[0198] SELECT COUNT(*),AVG(v1),AVG(v2)
[0199] FROM table1
[0200] WHERE time_minutes BETWEEN 31AND 60
[0201] 两个新的子查询仅有数据过滤条件不同,属于分段类子查询,可以先对time_minutes进行聚合,同时,聚合函数AVG可以转变为聚合函数SUM与聚合函数COUNT的相除。同时指定中间查询数据表为tmp_table AS,从而合并后得到的公共子查询为:
[0202] CREATE TABLE tmp_table AS
[0203] SELECT time_minutes,COUNT(*)count,SUM(v1)sum_v1,COUNT(v1)count_v1,SUM(v2)sum_v2,COUNT(v2)count_v2
[0204] FROM table1
[0205] GROUP BY time_minutes
[0206] 由此,通过一次百万级扫表操作,得到了一个60行的中间结果,相当于把2次百万级扫表聚合变成了1次百万级扫表操作和多次60行的查询。
[0207] 相应的,优化子查询改写为:
[0208]
[0209]
[0210] 实施例三
[0211] 图3a为本发明实施例三中的一种查询语句优化方法的流程图,本实施例以上述实施例为基础进行具体化,将对所述备选优化查询进行代价评估,具体化为:计算所述备选优化查询中各子查询执行的第一代价评估值;计算所述备选优化查询的子查询结果存储的第二代价评估值;计算所述备选优化查询中子查询补充修改的第三代价评估值;将所述第一代价评估值、所述第二代价评估值和所述第三代价评估值的相加结果作为所述备选优化查询的修改代价评估值。
[0212] 本实施例的方法具体包括:
[0213] 步骤310,在检测到查询优化请求时,获取所述查询优化请求指向的待处理查询,所述待处理查询中包括多个子查询。
[0214] 本实施例中待处理查询、子查询、子查询组、查询优化条件、代价评估和备选优化查询等可以参考上述实施例的描述。
[0215] 步骤320,采用预设的查询优化规则,逐级对所述待处理查询中包括的满足查询优化条件的子查询组进行优化处理,得到与所述待处理查询对应的备选优化查询,所述子查询组中包括至少两个子查询。
[0216] 步骤330,对所述待处理查询进行代价评估。
[0217] 步骤340,计算所述备选优化查询中各子查询执行的第一代价评估值。
[0218] 第一代价评估值用于评价执行子查询耗费的代价,也即是子查询本身的代价。
[0219] 步骤350,计算所述备选优化查询的子查询结果存储的第二代价评估值。
[0220] 第二代价评估值用于评价子查询写入外部存储的代价,也即是子查询的存储代价。此外,如果子查询的插叙结果并未存储在外部存储,而是直接存储在内存中,第二代价评估值为0。
[0221] 步骤360,计算所述备选优化查询中子查询补充修改的第三代价评估值。
[0222] 实际上,若将子查询关联的中间结果存储在预设的查询数据表中,在对子查询本身进行修改之外,还需要额外补充从预设的查询数据表中获取中间结果,并得到最终查询结果的查询语句,而这部分查询语句是之前未出现的,在优化后新增的,同样需要进行代价评估。第三代价评估值用于评价子查询关联的补充的子查询的执行代价,也即前述额外补充的修改后的子查询的执行代价。
[0223] 步骤370,将所述第一代价评估值、所述第二代价评估值和所述第三代价评估值的相加结果作为所述备选优化查询的修改代价评估值。
[0224] 步骤380,如果将所述备选优化查询的代价评估结果与所述待处理查询的代价评估结果进行比较,确定所述备选优化查询的代价评估结果优于所述待处理查询的代价评估结果,则将所述备选优化查询作为所述待处理查询的优化结果,以使所述备选优化查询替换所述待处理查询进行数据查询。
[0225] 可选的,所述确定所述备选优化查询的代价评估结果优于所述待处理查询的代价评估结果,包括:当所述待处理查询的初始代价评估值与预设调整系数的乘积大于所述备选优化查询的修改代价评估值时,确定所述备选优化查询的代价评估结果优于所述待处理查询的代价评估结果。
[0226] 其中,调整系数用于调整基于代价的优化(Cost-Based Optimization,CBO)的评价结果,减少评估偏差。调整系数可以根据经验进行设置,还可以根据实际使用场景,获取查询样本作为训练集进行训练,使调整系数更符合实际需求。
[0227] 具体的,基于如下公式进行代价评估结果的比较:
[0228] Y=COST0*A-SUM(COST1,COST2,COST3)
[0229] 其中,COST0是待处理查询的初始代价评估值,A是调整系数,SUM(COST1,COST2,COST3)是备选优化查询的修改代价评估值,COST1是第一代价评估值,COST2是第二代价评估值,COST3是第三代价评估值。Y即为待处理查询与备选优化查询的代价比较结果。
[0230] 当Y大于0时,表明待处理查询的代价大于备选优化查询的代价,备选优化查询的查询性能优于待处理查询的查询性能;当Y=0时,表明待处理查询的代价等于备选优化查询的代价,备选优化查询的查询性能同于待处理查询的查询性能;当Y<0时,表明待处理查询的代价小于备选优化查询的代价,备选优化查询的查询性能劣于待处理查询的查询性能。
[0231] 通过配置调整系数,调整代价评估值,可以减少代价评估的评估误差,提高代价评估的准确率,从而实现准确比较待处理查询与备选优化查询的优劣。
[0232] 在上述实施例的基础上,可选的,在确定所述备选优化查询的代价评估结果优于所述待处理查询的代价评估结果之前,还包括:根据历史待处理查询的初始代价评估值、历史备选优化查询的修改代价评估值、历史待处理查询的初始运行时间和历史备选优化查询的修改运行时间,修正所述预设调整系数。
[0233] 具体的,分别计算所述历史待处理查询的初始代价评估值,以及匹配的历史备选优化查询的修改代价评估值;执行所述历史待处理查询,统计所述历史待处理查询的初始运行时间;执行所述历史备选优化查询,统计所述历史备选优化查询的修改运行时间;根据所述历史待处理查询的初始代价评估值、所述历史备选优化查询的修改代价评估值、所述初始运行时间和所述修改运行时间,调整所述预设调整系数。
[0234] 其中,子查询耗费的资源包括时间资源,也即可以用子查询的运行时间来表征子查询耗费的资源。相应的,代价评估值可以采用查询的运行时间表征。
[0235] 历史待处理查询和历史备选优化查询均用于确定调整系数。历史备选优化查询可以是指历史待处理查询经过优化处理的查询,该优化处理可以是人工完成,也可以是本发明实施例中提供的优化处理方法完成。通常,历史待处理查询和历史备选优化查询成对出现,可以将历史待处理查询和关联的历史备选优化查询作为样本组,用于调整调整系数。
[0236] 初始运行时间用于作为历史待处理查询的代价评估值,修改运行时间用于作为历史备选优化查询的代价评估值。具体的,运行时间可以采用计数器通过对执行查询进行计数统计得到,此外,还有其他方式获取运行时间,对此,本发明实施例不作具体限制。
[0237] 在一个具体的例子中,如图3b所示,调整系数的确定方法具体包括:
[0238] 步骤321,获取初始调整系数。
[0239] 其中,初始调整系数可以是根据经验预先设定的,也可以是1。
[0240] 步骤322,从样本集中获取一个新的查询。
[0241] 样本集中包括多个查询,用于确定调整系数。
[0242] 步骤323,对所述查询进行改写。
[0243] 改写方式可以是人工,也可以是如本发明实施例中任一所述的查询语句优化方法。
[0244] 步骤324,获取所述查询改写前的第一代价,以及改写后的所述查询的第二代价。
[0245] 步骤325,运行所述查询,获取所述查询的第一运行时间,以及运行改写后的所述查询,并获取改写后的所述查询的第二运行时间。
[0246] 步骤326,根据所述第一代价、所述第二代价、所述第一运行时间,以及所述第二运行时间作比较,修改所述调整系数。
[0247] 代价可以采用查询的运行时间表征。由此,可以通过第一运行时间和第二运行时间,调整第一代价与第二代价的值。示例性的,第一运行时间与第二运行时间的比值应该等于第一代价与第二代价的比值。若不相等,修改调整系数,使第一代价与第二代价的比值与调整系数的乘积等于第一运行时间与第二运行时间的比值。
[0248] 步骤327,判断样本集中的查询是否均处理完成,如果是,则执行步骤328,否则执行步骤322。
[0249] 步骤328,获取修改后的调整系数。
[0250] 通过将历史待处理查询的初始运行时间和历史备选优化查询的修改运行时间分别作为真实值,并基于预设的公式计算调整系数,以更新调整系数,实现准确计算调整系数,从而基于该调整系数,实现准确比较待处理查询与备选优化查询的优劣。
[0251] 本发明实施例通过计算子查询的执行代价、存储代价以及补充的子查询的执行代价,并将三个代价的相加结果作为修改代价评估值,实现全面且准确评估子查询优化后的代价,从而使备选优化查询的查询性能与待处理查询的查询性能的比较结果更加准确和可靠。
[0252] 在上述实施例的基础上,可选的,所述采用预设的查询优化规则,逐级对所述待处理查询中包括的满足查询优化条件的子查询组进行优化处理,得到与所述待处理查询对应的备选优化查询,包括:判断所述待处理查询中是否包括满足查询优化条件的至少一个子查询组;若是,则根据子查询组所满足的查询优化条件对所述至少一个子查询组进行优化处理,得到新的子查询;根据所述新的子查询更新所述待处理查询后,返回执行判断所述待处理查询中是否包括满足查询优化条件的至少一个子查询组的操作,直至满足结束优化条件;将最近一次更新的所述待处理查询,作为所述备选优化查询。
[0253] 可选的,所述判断所述待处理查询中是否包括满足查询优化条件的至少一个子查询组,包括:对所述待处理查询中各个子查询进行查询语句的解析,得到与各所述子查询分别对应的比对参数集合、非幂等调用方法的包含属性以及聚合函数的归约属性,所述比对参数集合中包括:列参数属性、查询数据表属性以及数据过滤条件;如果至少两个第一目标子查询的比对参数集合之间仅列参数属性不同,且各所述第一目标子查询的非幂等调用方法的包含属性均为否,则将所述至少两个第一目标子查询加入至满足重复查询优化条件的子查询组中;如果至少两个第二目标子查询的比对参数集合中查询数据表属性相同,且至少一个所述第二目标子查询包括的聚合函数的归约属性为是,则将所述第二目标子查询加入至满足分段查询优化条件的子查询组中。
[0254] 可选的,所述根据子查询组所满足的查询优化条件对所述至少一个子查询组进行优化处理,得到新的子查询,包括:在每个所述满足重复查询优化条件的子查询组中,按照列参数属性,将包括的至少两个第一目标子查询进行合并,得到新的子查询;和/或在每个所述满足分段查询优化条件的子查询组中,按照所述满足分段查询优化条件的子查询组匹配的数据过滤条件,将包括的至少两个第二目标子查询进行合并,并确定每个所述第二目标子查询的聚合函数关联的至少一个归约函数,生成公共子查询,以及指定所述公共子查询的查询结果的存储地址;根据每个所述第二目标子查询的列参数属性包括的聚合函数与关联的至少一个所述归约函数的计算关系,数据过滤条件以及所述存储地址,生成所述第二目标子查询匹配的优化子查询;将所述公共子查询与至少一个所述优化子查询均作为新的子查询。
[0255] 实施例四
[0256] 图4为本发明实施例四中的一种查询语句优化装置的示意图。实施例四是实现本发明上述实施例提供的查询语句优化方法的相应装置,该装置可采用软件和/或硬件的方式实现,并一般可集成电子设备中,例如,计算机设备,具体是终端设备或服务器等。
[0257] 相应的,本实施例的装置可以包括:
[0258] 待处理查询获取模块410,用于在检测到查询优化请求时,获取取所述查询优化请求指向的待处理查询,所述待处理查询中包括多个子查询;
[0259] 待处理查询逐级优化模块420,用于采用预设的查询优化规则,逐级对所述待处理查询中包括的满足查询优化条件的子查询组进行优化处理,得到与所述待处理查询对应的备选优化查询,所述子查询组中包括至少两个子查询;
[0260] 优化代价评估模块430,用于分别对所述待处理查询和所述备选优化查询进行代价评估;
[0261] 优化替换模块440,用于将所述备选优化查询的代价评估结果与所述待处理查询的代价评估结果进行比较,如果确定所述备选优化查询的代价评估结果优于所述待处理查询的代价评估结果,则将所述备选优化查询作为所述待处理查询的优化结果,以使所述备选优化查询替换所述待处理查询进行数据查询。
[0262] 本发明实施例通过对子查询进行逐级优化,生成备选优化查询,实现自动优化查询,并在备选优化查询的代价优于待处理查询的代价时,备选优化查询替换待处理查询进行数据查询,实现评估优化后的查询性能,以及在查询性能提高时使用备选优化查询,解决了现有技术中人工改写查询语句而且无法保证改写后的查询一定能提升查询性能的问题,可以实现减少人工成本,提高查询优化效率,同时还可以保留真正提升查询性能的备选优化查询,提高查询优化的质量。
[0263] 在上述各实施例的基础上,所述待处理查询逐级优化模块420,包括:逐级优化单元,用于判断所述待处理查询中是否包括满足查询优化条件的至少一个子查询组;若是,则根据子查询组所满足的查询优化条件对所述至少一个子查询组进行优化处理,得到新的子查询;根据所述新的子查询更新所述待处理查询后,返回执行判断所述待处理查询中是否包括满足查询优化条件的至少一个子查询组的操作,直至满足结束优化条件;将最近一次更新的所述待处理查询,作为所述备选优化查询。
[0264] 在上述各实施例的基础上,所述逐级优化单元,包括:查询优化条件判断子单元,用于对所述待处理查询中各个子查询进行查询语句的解析,得到与各所述子查询分别对应的比对参数集合、非幂等调用方法的包含属性以及聚合函数的归约属性,所述比对参数集合中包括:列参数属性、查询数据表属性以及数据过滤条件;如果至少两个第一目标子查询的比对参数集合之间仅列参数属性不同,且各所述第一目标子查询的非幂等调用方法的包含属性均为否,则将所述至少两个第一目标子查询加入至满足重复查询优化条件的子查询组中;如果至少两个第二目标子查询的比对参数集合中查询数据表属性相同,且至少一个所述第二目标子查询包括的聚合函数的归约属性为是,则将所述第二目标子查询加入至满足分段查询优化条件的子查询组中。
[0265] 在上述各实施例的基础上,所述逐级优化单元,包括:新子查询生成子单元,用于在每个所述满足重复查询优化条件的子查询组中,按照列参数属性,将包括的至少两个第一目标子查询进行合并,得到新的子查询;和/或在每个所述满足分段查询优化条件的子查询组中,按照所述满足分段查询优化条件的子查询组匹配的数据过滤条件,将包括的至少两个第二目标子查询进行合并,并确定每个所述第二目标子查询的聚合函数关联的至少一个归约函数,生成公共子查询,以及指定所述公共子查询的查询结果的存储地址;根据每个所述第二目标子查询的列参数属性包括的聚合函数与关联的至少一个所述归约函数的计算关系,数据过滤条件以及所述存储地址,生成所述第二目标子查询匹配的优化子查询;将所述公共子查询与至少一个所述优化子查询均作为新的子查询。
[0266] 在上述各实施例的基础上,所述优化代价评估模块430,包括:备选优化查询代价评估单元,用于计算所述备选优化查询中各子查询执行的第一代价评估值;计算所述备选优化查询的子查询结果存储的第二代价评估值;计算所述备选优化查询中子查询补充修改的第三代价评估值;将所述第一代价评估值、所述第二代价评估值和所述第三代价评估值的相加结果作为所述备选优化查询的修改代价评估值。
[0267] 在上述各实施例的基础上,所述优化替换模块440,包括:优化判断单元,用于当所述待处理查询的初始代价评估值与预设调整系数的乘积大于所述备选优化查询的修改代价评估值时,确定所述备选优化查询的代价评估结果优于所述待处理查询的代价评估结果。
[0268] 在上述各实施例的基础上,所述查询语句优化装置,还包括:调整系数确定模块,用于分别计算所述历史待处理查询的初始代价评估值,以及匹配的历史备选优化查询的修改代价评估值;执行所述历史待处理查询,统计所述历史待处理查询的初始运行时间;执行所述历史备选优化查询,统计所述历史备选优化查询的修改运行时间;根据所述历史待处理查询的初始代价评估值、所述历史备选优化查询的修改代价评估值、所述初始运行时间和所述修改运行时间,调整所述预设调整系数。
[0269] 上述查询语句优化装置可执行本发明实施例任一所提供的查询语句优化方法,具备执行的查询语句优化方法相应的功能模块和有益效果。
[0270] 实施例五
[0271] 图5为本发明实施例五提供的一种计算机设备的结构示意图。图5示出了适于用来实现本发明实施方式的示例性计算机设备12的框图。图5显示的计算机设备12仅仅是一个示例,不应对本发明实施例的功能和使用范围带来任何限制。
[0272] 如图5所示,计算机设备12以通用计算设备的形式表现。计算机设备12的组件可以包括但不限于:一个或者多个处理器16或者处理单元,存储器28,连接不同系统组件(包括存储器28和处理器16)的总线18。计算机设备12可以是服务器或客户端。
[0273] 总线18表示几类总线结构中的一种或多种,包括存储器总线或者存储器控制器,外围总线,图形加速端口,处理器或者使用多种总线结构中的任意总线结构的局域总线。举例来说,这些体系结构包括但不限于工业标准体系结构(Industry  Standard Architecture,ISA)总线,微通道体系结构(Micro Channel Architecture,MCA)总线,增强型ISA总线、视频电子标准协会(Video Electronics Standards Association,VESA)局域总线以及外围组件互连(Peripheral Component Interconnect,PCI)总线。
[0274] 计算机设备12典型地包括多种计算机系统可读介质。这些介质可以是任何能够被计算机设备12访问的可用介质,包括易失性和非易失性介质,可移动的和不可移动的介质。
[0275] 存储器28可以包括易失性存储器形式的计算机系统可读介质,例如随机存取存储器(RAM)30和/或高速缓存存储器32。计算机设备12可以进一步包括其它可移动/不可移动的、易失性/非易失性计算机系统存储介质。仅作为举例,存储系统34可以用于读写不可移动的、非易失性磁介质(图5未显示,通常称为“硬盘驱动器”)。尽管图5中未示出,可以提供用于对可移动非易失性磁盘(例如“软盘”)读写的磁盘驱动器,以及对可移动非易失性光盘(例如紧凑磁盘只读存储器(Compact Disc Read-Only Memory,CD-ROM),数字视盘(Digital Video Disc-Read Only Memory,DVD-ROM)或者其它光介质)读写的光盘驱动器。在这些情况下,每个驱动器可以通过一个或者多个数据介质接口与总线18相连。存储器28可以包括至少一个程序产品,该程序产品具有一组(例如至少一个)程序模块,这些程序模块被配置以执行本发明各实施例的功能。
[0276] 具有一组(至少一个)程序模块42的程序/实用工具40,可以存储在例如存储器28中,这样的程序模块42包括——但不限于——操作系统、一个或者多个应用程序、其它程序模块以及程序数据,这些示例中的每一个或某种组合中可能包括网络环境的实现。程序模块42通常执行本发明所描述的实施例中的功能和/或方法。
[0277] 计算机设备12也可以与一个或多个外部设备14(例如键盘、指向设备、显示器24等)通信,还可与一个或者多个使得用户能与该计算机设备12交互的设备通信,和/或与使得该计算机设备12能与一个或多个其它计算设备进行通信的任何设备(例如网卡,调制解调器等等)通信。这种通信可以通过输入/输出(Input/Output,I/O)接口22进行。并且,计算机设备12还可以通过网络适配器20与一个或者多个网络(例如局域网(Local Area Network,LAN),广域网(Wide Area Network,WAN)通信。如图所示,网络适配器20通过总线18与计算机设备12的其它模块通信。应当明白,尽管图5中未示出,可以结合计算机设备12使用其它硬件和/或软件模块,包括但不限于:微代码、设备驱动器、冗余处理单元、外部磁盘驱动阵列、(Redundant Arrays of Inexpensive Disks,RAID)系统、磁带驱动器以及数据备份存储系统等。
[0278] 处理器16通过运行存储在存储器28中的程序,从而执行各种功能应用以及数据处理,例如执行以下操作:
[0279] 在检测到查询优化请求时,获取所述查询优化请求指向的待处理查询,所述待处理查询中包括多个子查询;
[0280] 采用预设的查询优化规则,逐级对所述待处理查询中包括的满足查询优化条件的子查询组进行优化处理,得到与所述待处理查询对应的备选优化查询,所述子查询组中包括至少两个子查询;
[0281] 分别对所述待处理查询和所述备选优化查询进行代价评估;
[0282] 如果将所述备选优化查询的代价评估结果与所述待处理查询的代价评估结果进行比较,确定所述备选优化查询的代价评估结果优于所述待处理查询的代价评估结果,则将所述备选优化查询作为所述待处理查询的优化结果,以使所述备选优化查询替换所述待处理查询进行数据查询。
[0283] 在上述各实施例的基础上,处理器16是设置为通过以下方式所述处理器是设置为通过以下方式得到与所述待处理查询对应的备选优化查询:
[0284] 判断所述待处理查询中是否包括满足查询优化条件的至少一个子查询组;
[0285] 若是,则根据子查询组所满足的查询优化条件对所述至少一个子查询组进行优化处理,得到新的子查询;
[0286] 根据所述新的子查询更新所述待处理查询后,返回执行判断所述待处理查询中是否包括满足查询优化条件的至少一个子查询组的操作,直至满足结束优化条件;
[0287] 将最近一次更新的所述待处理查询,作为所述备选优化查询。
[0288] 在上述各实施例的基础上,处理器16是设置为通过以下方式判断所述待处理查询中是否包括满足查询优化条件的至少一个子查询组:
[0289] 对所述待处理查询中各个子查询进行查询语句的解析,得到与各所述子查询分别对应的比对参数集合、非幂等调用方法的包含属性以及聚合函数的归约属性,所述比对参数集合中包括:列参数属性、查询数据表属性以及数据过滤条件;
[0290] 如果至少两个第一目标子查询的比对参数集合之间仅列参数属性不同,且各所述第一目标子查询的非幂等调用方法的包含属性均为否,则将所述至少两个第一目标子查询加入至满足重复查询优化条件的子查询组中;
[0291] 如果至少两个第二目标子查询的比对参数集合中查询数据表属性相同,列参数属性相同或不全相同,且数据过滤条件不同,每个所述第二目标子查询包括的聚合函数的归约属性为是,则将所述第二目标子查询加入至满足分段查询优化条件的子查询组中。
[0292] 在上述各实施例的基础上,处理器16是设置为通过以下方式得到新的子查询:
[0293] 在每个所述满足重复查询优化条件的子查询组中,按照列参数属性,将包括的至少两个第一目标子查询进行合并,得到新的子查询;和/或
[0294] 在每个所述满足分段查询优化条件的子查询组中,按照所述满足分段查询优化条件的子查询组匹配的数据过滤条件,将包括的至少两个第二目标子查询进行合并,并确定每个所述第二目标子查询的聚合函数关联的至少一个归约函数,生成公共子查询,以及指定所述公共子查询的查询结果的存储地址;
[0295] 根据每个所述第二目标子查询的列参数属性包括的聚合函数与所述公共子查询中关联的至少一个所述归约函数的计算关系,所述数据过滤条件以及所述存储地址,生成所述第二目标子查询匹配的优化子查询;
[0296] 将所述公共子查询与至少一个所述优化子查询均作为新的子查询。
[0297] 在上述各实施例的基础上,处理器16是设置为通过以下方式对所述备选优化查询进行代价评估:
[0298] 计算所述备选优化查询中各子查询执行的第一代价评估值;
[0299] 计算所述备选优化查询的子查询结果存储的第二代价评估值;
[0300] 计算所述备选优化查询中子查询补充修改的第三代价评估值;
[0301] 将所述第一代价评估值、所述第二代价评估值和所述第三代价评估值的相加结果作为所述备选优化查询的修改代价评估值。
[0302] 在上述各实施例的基础上,处理器16是设置为通过以下方式确定所述备选优化查询的代价评估结果优于所述待处理查询的代价评估结果:
[0303] 当所述待处理查询的初始代价评估值与预设调整系数的乘积大于所述备选优化查询的修改代价评估值时,确定所述备选优化查询的代价评估结果优于所述待处理查询的代价评估结果。
[0304] 在上述各实施例的基础上,处理器16还设置为:
[0305] 根据历史待处理查询的初始代价评估值、历史备选优化查询的修改代价评估值、历史待处理查询的初始运行时间和历史备选优化查询的修改运行时间,修正所述预设调整系数。
[0306] 实施例六
[0307] 本发明实施例六提供了一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现如本申请所有发明实施例提供的查询语句优化方法:
[0308] 本发明实施例的计算机存储介质,可以采用一个或多个计算机可读的介质的任意组合。计算机可读介质可以是计算机可读信号介质或者计算机可读存储介质。计算机可读存储介质例如可以是——但不限于——电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。计算机可读存储介质的更具体的例子(非穷举的列表)包括:具有一个或多个导线的电连接、便携式计算机磁盘、硬盘、RAM、只读存储器(Read Only Memory,ROM)、可擦式可编程只读存储器(Erasable Programmable Read Only Memory,EPROM)、闪存、光纤、便携式CD-ROM、光存储器件、磁存储器件、或者上述的任意合适的组合。在本文件中,计算机可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。
[0309] 计算机可读的信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了计算机可读的程序代码。这种传播的数据信号可以采用多种形式,包括——但不限于——电磁信号、光信号或上述的任意合适的组合。计算机可读的信号介质还可以是计算机可读存储介质以外的任何计算机可读介质,该计算机可读介质可以发送、传播或者传输用于由指令执行系统、装置或者器件使用或者与其结合使用的程序。
[0310] 计算机可读介质上包含的程序代码可以用任何适当的介质传输,包括——但不限于——无线、电线、光缆、无线电频率(RadioFrequency,RF)等等,或者上述的任意合适的组合。
[0311] 可以以一种或多种程序设计语言或其组合来编写用于执行本发明操作的计算机程序代码,所述程序设计语言包括面向对象的程序设计语言—诸如Java、Smalltalk、C++,还包括常规的过程式程序设计语言—诸如“C”语言或类似的程序设计语言。程序代码可以完全地在用户计算机上执行、部分地在用户计算机上执行、作为一个独立的软件包执行、部分在用户计算机上部分在远程计算机上执行、或者完全在远程计算机或服务器上执行。在涉及远程计算机的情形中,远程计算机可以通过任意种类的网络——包括LAN或WAN——连接到用户计算机,或者,可以连接到外部计算机(例如利用因特网服务提供商来通过因特网连接)。
[0312] 注意,上述仅为本发明的较佳实施例及所运用技术原理。本领域技术人员会理解,本发明不限于这里所述的特定实施例,对本领域技术人员来说能够进行各种明显的变化、重新调整和替代而不会脱离本发明的保护范围。因此,虽然通过以上实施例对本发明进行了较为详细的说明,但是本发明不仅仅限于以上实施例,在不脱离本发明构思的情况下,还可以包括更多其他等效实施例,而本发明的范围由所附的权利要求范围决定。