发明内容
为了解决现有技术的问题,本发明实施例提供了一种执行计划的优化方法、装置、计算机设备和存储介质,以克服现有技术中数据库中返回全量汇总数据导致数据库计算量大、增加网络传输压力以及响应时间长等问题。
为解决上述一个或多个技术问题,本发明采用的技术方案是:
第一方面,提供了一种执行计划的优化方法,该方法包括如下步骤:
获取查询请求,解析出所述查询请求所采用的操作方式以及对应的场景,其中所述操作方式包括全外连接、联合、左外连接、右外连接以及内连接;
结合所述操作方式以及所述场景,将汇总和/或limit操作按照预设的策略下推,生成执行计划;
按照所述执行计划在数据库中执行相应操作,输出查询结果。
进一步的,当所述操作方式为全外连接或联合,所述场景为对汇总值不进行排序时,所述将汇总和/或limit操作按照预设的策略下推,生成执行计划包括:
对同期结果集以及本期结果集按照分析维度的组合进行排序后,将所述limit操作下推到数据库中。
进一步的,当所述操作方式为全外连接或联合,所述场景为对维度进行排序时,所述将汇总和/或limit操作按照预设的策略下推,生成执行计划包括:
检验排序字段与分析维度是否一致,若不一致,则将所述排序字段设置为与所述分析维度一致,对所述维度重新进行排序后,将所述limit操作下推到数据库中。
进一步的,当所述操作方式为全外连接或联合,所述场景为对汇总值进行排序时,所述将汇总和/或limit操作按照预设的策略下推,生成执行计划包括:
对汇总值进行排序的结果集进行汇总计算后,将所述汇总和所述limit操作均下推到数据库中,获取返回的第一结果集;
将所述第一结果集中的维度值作为过滤条件传给其余结果集,获取返回的第二结果集;
将所述第二结果集与所述第一结果集进行匹配,将匹配成功的结果补充至所述第一结果集中,生成最终的结果集。
进一步的,当所述操作方式为左外连接,所述场景为对汇总值不进行排序或对维度进行排序或对左表中的汇总值进行排序时,所述将汇总和/或limit操作按照预设的策略下推,生成执行计划包括:
将所述汇总操作、所述limit操作以及过滤操作直接下推到左表中,获取左表返回的结果集;
将所述左表返回的结果集中的维度值作为过滤条件,传到右表中,将右表的汇总结果与所述左表返回的结果集进行匹配,生成最终的结果集。
进一步的,当所述操作方式为左外连接,所述场景为对右表中的汇总值进行排序时,所述将汇总和/或limit操作按照预设的策略下推,生成执行计划包括:
设置下推参数以及放大比例;
根据所述下推参数判断是否满足下推的条件,若满足,则将所述limit操作中的limit值按照所述放大比例放大;
将放大后的所述limit操作与排序操作下推到右表中,获取右表返回的结果集;
将所述右表返回的结果集中的维度值作为过滤条件,传到左表中,将左表的汇总结果与所述右表返回的结果集进行匹配,生成最终的结果集。
进一步的,当所述操作方式为右外连接,所述场景为对汇总值不进行排序或对维度进行排序或对右表中的汇总值进行排序时,所述将汇总和/或limit操作按照预设的策略下推,生成执行计划包括:
将所述汇总操作、所述limit操作以及过滤操作直接下推到右表中,获取右表返回的结果集;
将所述右表返回的结果集中的维度值作为过滤条件,传到左表中,将左表的汇总结果与所述右表返回的结果集进行匹配,生成最终的结果集。
进一步的,当所述操作方式为右外连接,所述场景为对左表中的汇总值进行排序时,所述将汇总和/或limit操作按照预设的策略下推,生成执行计划包括:
根据下推参数判断是否满足下推的条件,若满足,则将所述limit操作中的limit值按照预设的放大比例放大;
将放大后的所述limit操作与排序操作下推到左表中,获取左表返回的结果集;
将所述左表返回的结果集中的维度值作为过滤条件,传到右表中,将右表的汇总结果与所述左表返回的结果集进行匹配,生成最终的结果集。
进一步的,当所述操作方式为内连接,所述场景为对汇总值不进行排序或对维度进行排序时,所述将汇总和/或limit操作按照预设的策略下推,生成执行计划包括:
将排序字段设置为与分析维度一致,对左表和右表的结果集进行排序,并则将所述limit操作中的limit值按照预设的放大比例放大,将放大后的所述limit操作下推到数据库中。
进一步的,当所述操作方式为内连接,所述场景为对汇总值进行排序时,所述将汇总和/或limit操作按照预设的策略下推,生成执行计划包括:
将所述limit操作中的limit值按照预设的放大比例放大,将放大后的所述limit操作下推到对汇总值进行排序的表中,获取返回的第三结果集;
将所述第三结果集中的维度值作为过滤条件传至另一个表中进行过滤汇总,获取返回的第四结果集;
将所述第三结果集与所述第四结果集进行匹配,返回匹配成功的结果集。
第二方面,提供了一种执行计划的优化装置,所述装置包括:
数据解析模块,用于获取查询请求,解析出所述查询请求所采用的操作方式以及对应的场景,其中所述操作方式包括全外连接、联合、左外连接、右外连接以及内连接;
计划生成模块,用于结合所述操作方式以及所述场景,将汇总和/或limit操作按照预设的策略下推,生成执行计划;
操作执行模块,用于按照所述执行计划在数据库中执行相应操作,输出查询结果。
进一步的,所述计划生成模块包括:
数据排序单元,用于对同期结果集以及本期结果集按照分析维度的组合进行排序后;
操作下推单元,用于将所述limit操作下推到数据库中。
进一步的,所述计划生成模块还包括:
检验单元,用于检验排序字段与分析维度是否一致;
维度设置单元,用于将所述排序字段设置为与所述分析维度一致;
所述排序单元还用于对所述维度重新进行排序。
进一步的,所述计划生成模块还包括:
汇总计算单元,用于对汇总值进行排序的结果集进行汇总计算后;
所述操作下推单元还用于将所述汇总和所述limit操作均下推到数据库中,获取返回的第一结果集;
条件传送单元,用于将所述第一结果集中的维度值作为过滤条件传给其余结果集,获取返回的第二结果集;
结果匹配单元,用于将所述第二结果集与所述第一结果集进行匹配,将匹配成功的结果补充至所述第一结果集中,生成最终的结果集。
进一步的,所述操作下推单元还用于将所述汇总操作、所述limit操作以及过滤操作直接下推到左表中,获取左表返回的结果集;
所述条件传送单元还用于将所述左表返回的结果集中的维度值作为过滤条件,传到右表中;
所述结果匹配单元还用于将右表的汇总结果与所述左表返回的结果集进行匹配,生成最终的结果集。
进一步的,所述计划生成模块还包括:
参数设置单元,用于设置下推参数以及放大比例;
判断单元,用于根据所述下推参数判断是否满足下推的条件;
放大单元,用于将所述limit操作中的limit值按照所述放大比例放大;
所述操作下推单元还用于将放大后的所述limit操作与排序操作下推到右表中,获取右表返回的结果集;
所述条件传送单元还用于将所述右表返回的结果集中的维度值作为过滤条件,传到左表中;
所述结果匹配单元还用于将左表的汇总结果与所述右表返回的结果集进行匹配,生成最终的结果集。
进一步的,所述操作下推单元还用于将所述汇总操作、所述limit操作以及过滤操作直接下推到右表中,获取右表返回的结果集。
进一步的,所述操作下推单元还用于将放大后的所述limit操作与排序操作下推到左表中,获取左表返回的结果集。
进一步的,所述数据排序单元还用于对左表和右表的结果集进行排序。
进一步的,所述操作下推单元还用于将放大后的所述limit操作下推到对汇总值进行排序的表中,获取返回的第三结果集;
所述条件传送单元还用于将所述第三结果集中的维度值作为过滤条件传至另一个表中进行过滤汇总,获取返回的第四结果集;
所述结果匹配单元还用于将所述第三结果集与所述第四结果集进行匹配,返回匹配成功的结果集。
第三方面,提供了一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现如下步骤:
获取查询请求,解析出所述查询请求所采用的连接操作的操作方式以及对应的场景,其中所述操作方式包括全外连接、左外连接、右外连接以及内连接;
结合所述操作方式以及所述场景,将汇总和/或limit操作按照预设的策略下推,生成执行计划;
按照所述执行计划在数据库中执行相应操作,输出查询结果。
第四方面,提供了一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时,实现如下步骤:
获取查询请求,解析出所述查询请求所采用的连接操作的操作方式以及对应的场景,其中所述操作方式包括全外连接、左外连接、右外连接以及内连接;
结合所述操作方式以及所述场景,将汇总和/或limit操作按照预设的策略下推,生成执行计划;
按照所述执行计划在数据库中执行相应操作,输出查询结果。
本发明实施例提供的技术方案带来的有益效果是:
本发明实施例提供的执行计划的优化方法、装置、计算机设备以及计算机可读存储介质,通过将汇总、limit等操作下推到olap数据库中,充分利用了olap(联机分析处理)数据库的优化特性,一方面,使得olap数据库的计算量明显减少,提升性能、并发性和资源利用率,另一方面,从olap数据库中返回到SQL引擎的数据量明显减少,减少了网络传输压力,且使得spark等SQL引擎的性能、并发性和资源里有了显著提高;避免了在高基数汇总时存在的限制以及spark SQL、presto等SQL引擎在进行大数据量多表join时的性能问题;且对于一些基数非常高的汇总查询,因为要返回全量数据,olap数据库可能无法及时处理,但是通过本方案,则可以在规定的响应时间内能够查询出数据。
具体实施方式
为使本发明的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
本发明实施例主要分析olap数据库中多表之间的join(连接)和union(联合)操作,利用了druid、pinot、clickhouse等olap数据库的优势,在进行多表关联或union操作时,根据不同的场景,采用不同的方式,尽量将过滤、汇总、limit等操作下推到olap数据库中,使得从数据库中返回比较少的数据,从而提升性能,减少资源消耗。这里需要说明的是,本发明实施例中,汇总下推以及limit下推,就是将SQL语句中汇总操作以及limit限制等直接下推到olap数据库中,在olap数据库中直接进行汇总或limit操作,并且按照排序规则输出限定行数的结果集。本发明实施例提供的执行计划的优化方法并不局限于OLAP数据库,同样可以用于传统数据库的汇总处理上。
图1是根据一示例性实施例示出的执行计划的优化方法的流程图,参照图1所示,该方法包括如下步骤:
获取查询请求,解析出所述查询请求所采用的连接操作的操作方式以及对应的场景,其中所述操作方式包括全外连接、联合、左外连接、右外连接以及内连接。
具体的,多表之间的操作方式有很多种,如join(连接)和union(联合),其中join(连接)又分为全外连接、左外连接、右外连接以及内连接。多表操作时的场景也分为多种,本发明实施例中,主要考虑以下几种场景:
1、对汇总值不进行排序;
2、对维度进行排序(例如计算本月的销售额时,维度可以包括大区、品牌、商品组等);
3、对汇总值进行排序,包括对本期汇总值进行排序和对同期汇总值进行排序;
4、对同比值进行排序。
本发明实施例中,对limit等操作进行下推时,需具体考虑多表之间的操作方式以及具体场景,因而,需要解析出获取的查询请求所采用的操作方式以及对应的场景。
结合所述操作方式以及所述场景,将汇总和/或limit操作按照预设的策略下推,生成执行计划。
具体的,本发明实施例中,针对多表之间采用的不同操作方式以及对应的场景,预先设置相应的策略。解析出查询请求所采用的操作方式以及对应的场景后,将汇总和/或limit操作按照预设的策略下推,生成执行计划。
按照所述执行计划在数据库中执行相应操作,输出查询结果。
作为一种较优的实施方式,本发明实施例中,当所述操作方式为全外连接或联合,所述场景为对汇总值不进行排序时,所述将汇总和/或limit操作按照预设的策略下推,生成执行计划包括:
对同期结果集以及本期结果集按照分析维度的组合进行排序后,将所述limit操作下推到数据库中。
具体的,全外连接(Full outer join)在匹配两个表时,不需要两个表之间的数据能够匹配上,即返回两个表数据的合集。联合(union)操作和全外连接(Full outer join)的语义相同。这种SQL一般用在同环比操作,例如计算本月的销售额,并且和去年同期的销售额进行比较,同时需要按照不同的维度组合进行汇总,例如大区、品牌、商品组等。SQL语句一般可以写为:
在未使用本发明提供的执行计划优化方法前,通常这类执行计划首先在olap数据库中汇总计算出本期和同期值,然后再将本期和同期的所有数据都返回到SQL引擎,由SQL引擎对数据再次进行汇总。如果查询语句中有过滤条件,会将过滤条件下推到olap数据库中。详细未优化的执行计划参照图2来表示(假设每个表返回的汇总数据量有100万条)。这里需要说明的是,图2中的操作方式联合(Union)以及Druid只是一种示例性说明,本执行计划并不局限于联合(Union)操作方式以及Druid数据库。
当操作方式为全外连接或联合,场景为对汇总值不进行排序时,在该场景下,如果直接将limit下推到数据库中,则可能会出现结果错误的情况。因为汇总结果不进行排序,返回的结果就具有不确定性,可能本期结果和同期结果都有某个相同的维度值,但是在下推过程中本期返回该维度值,而同期汇总结果没有返回该维度值,这样就会导致计算错误。
在本发明实施例中,对同期和本期两个结果集按照分析维度的组合进行排序,例如在上述示例中对于大区、品牌进行排序,然后再将limit操作下推到数据库中。由于两个表(指同期和本期结果集)的排序字段相同,因此从每个表中返回的汇总结果集也都是有序和确定的,可以匹配的数据一定可以匹配上,因此最终结果也是正确的。虽然SQL语句没有要求排序,但是对结果集进行排序也是能满足要求的。对于这类场景加上排序完全符合SQL语义。
全外连接(Full outer join)会返回两个表的合集,因此只需要按照SQL语句中的limit条数进行下推即可。如果两个结果集完全匹配,则最终结果也是limit限制的条数。如果两个结果集有些数据不匹配,则最终结果记录数会大于limit限制,还需要对结果再进行一次limit。优化后的执行计划参照图3所示。这里需要说明的是,图3中的操作方式联合(Union)以及Druid只是一种示例性说明,本优化后的执行计划并不局限于联合(Union)操作方式以及Druid数据库。
进一步参照图3所示,假设每个结果的汇总结果集都是100万。对比未优化的执行计划,可以看出优化后的执行计划有着巨大的性能提升。未进行优化时,olap数据库中进行高基数的计算和返回时性能很差,有时甚至无法完成计算。但是进行limit下推,对执行计划进行优化后,性能会有很大提升。而且对于这类limit,olap数据库本身实现时也有很多优化,并且在持续进行中。每个结果集都返回100万条记录到SQL引擎中,如果是进行join计算,可能就需要采用sort merge算法,计算复杂度和资源消耗量都急剧上升,而性能却急速下降。但是如果两个结果集都是100条,则可以使用map join算法。两个算法的性能和成本有着天壤之别,mapjoin的成本更低且性能更好。
作为一种较优的实施方式,本发明实施例中,当所述操作方式为全外连接或联合,所述场景为对维度进行排序时,所述将汇总和/或limit操作按照预设的策略下推,生成执行计划包括:
检验排序字段与分析维度是否一致,若不一致,则将所述排序字段设置为与所述分析维度一致,对所述维度重新进行排序后,将所述limit操作下推到数据库中。
具体的,该场景与对汇总值不进行排序的场景类似,但是需要注意的是要将排序的维度(即排序字段)补全。因此需要先检验对维度进行排序的排序字段与分析维度(即汇总分组的维度)是否一致,若不一致,则将排序字段设置为与分析维度一致,对维度重新进行排序后,将limit操作下推到数据库中。例如,如果汇总分组是按照大区、品牌,而只对大区排序,则需要将品牌作为排序字段加入到大区后面,即将order by大区补充为order by大区、品牌,否则也有可能出现结果不对的情况。
作为一种较优的实施方式,本发明实施例中,当所述操作方式为全外连接或联合,所述场景为对汇总值进行排序时,所述将汇总和/或limit操作按照预设的策略下推,生成执行计划包括:
对汇总值进行排序的结果集进行汇总计算后,将所述汇总和所述limit操作均下推到数据库中,获取返回的第一结果集;
将所述第一结果集中的维度值作为过滤条件传给其余结果集,获取返回的第二结果集;
将所述第二结果集与所述第一结果集进行匹配,将匹配成功的结果补充至所述第一结果集中,生成最终的结果集。
具体的,对汇总值进行排序包括对本期汇总值进行排序或对同期汇总值进行排序。因而,对于汇总值进行排序,汇总值总是要落到某一个表中,也就是对于汇总值所在的结果集进行了限制,这个结果集是固定不变的,其余结果集是需要匹配这个汇总值进行了排序的结果集。因此,本发明实施例中,先对汇总值排序的表进行汇总计算,将汇总和limit操作都下推到数据库中,获取返回的第一结果集。然后将返回的第一结果集中的维度值作为过滤条件传到其余结果集,获取返回的第二结果集。因为druid之类的olap数据库是对所有维度都进行了索引,因此对于过滤特别高效,一般情况下在毫秒级就可以返回汇总结果(即第二结果集)。将返回的第二结果集和上一个结果集(即第一结果集)进行匹配,将匹配成功的结果值补充到前一个结果集中(即第一结果集),生成最终的结果集。优化后的执行计划参照图4所示。这里需要说明的是,图4中的操作方式联合(Union)以及Druid只是一种示例性说明,本优化后的执行计划并不局限于联合(Union)操作方式以及Druid数据库。
这里需要说明的是,当所述操作方式为全外连接或联合,所述场景为对同比值进行排序时,此时,由于需要对两个结果集的汇总值进行除法运算,只有等到所有运算结果都出来以后,才能知道最终排序结果。所以此种场景下,无法进行limit下推,需要从olap数据库中返回全量计算结果。
作为一种较优的实施方式,本发明实施例中,当所述操作方式为左外连接,所述场景为对汇总值不进行排序或对维度进行排序或对左表中的汇总值进行排序时,所述将汇总和/或limit操作按照预设的策略下推,生成执行计划包括:
将所述汇总操作、所述limit操作以及过滤操作直接下推到左表中,获取左表返回的结果集;
将所述左表返回的结果集中的维度值作为过滤条件,传到右表中,将右表的汇总结果与所述左表返回的结果集进行匹配,生成最终的结果集。
具体的,左外连接以左表为主,要求返回左表中的所有数据。如果右表中记录可以和左表匹配,则将结果集中的值设置为右表中的值,否则设为null值。
因此,当操作方式为左外连接,场景为对汇总值不进行排序或对维度进行排序或对左表中的汇总值进行排序时,将过滤、汇总和limit操作直接下推到左表中,获取左表返回的结果集,不需要对排序进行额外操作。即若原来不进行排序,则下推到左表中的操作也不需要排序。然后将左表返回的结果集中的维度值作为过滤条件,传到右表中,将右表的汇总结果再与左表返回的结果集进行匹配操作,生成最终的结果集。
作为一种较优的实施方式,本发明实施例中,当所述操作方式为左外连接,所述场景为对右表中的汇总值进行排序时,所述将汇总和/或limit操作按照预设的策略下推,生成执行计划包括:
设置下推参数以及放大比例;
根据所述下推参数判断是否满足下推的条件,若满足,则将所述limit操作中的limit值按照所述放大比例放大;
将放大后的所述limit操作与排序操作下推到右表中,获取右表返回的结果集;
将所述右表返回的结果集中的维度值作为过滤条件,传到左表中,将左表的汇总结果与所述右表返回的结果集进行匹配,生成最终的结果集。
具体的,由于左外连接(Left outer join)操作是以左表为主,右表中的查询结果有可能在左表中没有对应的记录,这样的结果是需要被废弃的。因此需要对limit结果放大后推入到右表中,例如,如果sql语句要求limit 100,那么对右表下推时需要将limit设置成500(这里并不限于500,可以根据具体需求进行设置)。然后将右表返回结果的维度值作为过滤条件传到左表中。将左表的结果集和右表的结果集进行匹配,将不匹配的右表结果集的结果过滤掉。
如果最终join返回的结果集条数小于limit指定的条数,则有两种处理方式:
1、将结果集返回
2、转入到常规处理,即不进行下推操作。将左表和右表的所有结果都返回,然后再进行匹配计算和排序计算。
具体的处理方式,可以根据实际的返回结果集的情况进行选择,这里不再赘述。
因为这类情况比较复杂,因此在实际工程实现时,可以做如下优化:
首先,设置下推参数,根据下推参数判断是否需要,只有当下推参数的参数值为true时才进行下推。其次设置放大比例,将下推到右表中的limit放大,例如放大比例为5,limit为100,则最终下推limit为500。除此之外,还可以对于维度基数值进行估算,当维度基数小于一定值时也不进行下推等。
这里需要说明的是,本发明实施例中,当所述操作方式为左外连接,所述场景为对同比值进行排序时,该种场景也无法进行执行计划的优化。
作为一种较优的实施方式,本发明实施例中,当所述操作方式为右外连接,所述场景为对汇总值不进行排序或对维度进行排序或对右表中的汇总值进行排序时,所述将汇总和/或limit操作按照预设的策略下推,生成执行计划包括:
将所述汇总操作、所述limit操作以及过滤操作直接下推到右表中,获取右表返回的结果集;
将所述右表返回的结果集中的维度值作为过滤条件,传到左表中,将左表的汇总结果与所述右表返回的结果集进行匹配,生成最终的结果集。
具体的,右外连接与左外连接类似,只是左表换成了右表,即以右表为主,要求返回右表中的所有数据。如果左表中记录可以和右表匹配,则将结果集中的值设置为左表中的值,否则设为null值。
因此,当操作方式为右外连接,场景为对汇总值不进行排序或对维度进行排序或对右表中的汇总值进行排序时,将过滤、汇总和limit操作直接下推到右表中,获取右表返回的结果集,不需要对排序进行额外操作。即若原来不进行排序,则下推到右表中的操作也不需要排序。然后将右表返回的结果集中的维度值作为过滤条件,传到左表中,将左表的汇总结果再与右表返回的结果集进行匹配操作,生成最终的结果集。
作为一种较优的实施方式,本发明实施例中,当所述操作方式为右外连接,所述场景为对左表中的汇总值进行排序时,所述将汇总和/或limit操作按照预设的策略下推,生成执行计划包括:
根据下推参数判断是否满足下推的条件,若满足,则将所述limit操作中的limit值按照预设的放大比例放大;
将放大后的所述limit操作与排序操作下推到左表中,获取左表返回的结果集;
将所述左表返回的结果集中的维度值作为过滤条件,传到右表中,将右表的汇总结果与所述左表返回的结果集进行匹配,生成最终的结果集。
具体的,同样的,由于右外连接(Right outer join)操作是以右表为主,左表中的查询结果有可能在右表中没有对应的记录,这样的结果是需要被废弃的。因此同样需要对limit结果放大后推入左表中,然后将左表返回结果的维度值作为过滤条件传到右表中。将左表的结果集和右表的结果集进行匹配,将不匹配的左表结果集的结果过滤掉。
同样的,如果最终join返回的结果集条数小于limit指定的条数,则有两种处理方式:
1、将结果集返回
2、转入到常规处理,即不进行下推操作。将左表和右表的所有结果都返回,然后再进行匹配计算和排序计算。
在实际工程实现时,同样可以做如下优化:
首先,设置下推参数,根据下推参数判断是否需要,只有当下推参数的参数值为true时才进行下推。其次设置放大比例,将下推到左表中的limit放大,例如放大比例为5,limit为100,则最终下推limit为500。除此之外,还可以对于维度基数值进行估算,当维度基数小于一定值时也不进行下推等。
这里需要说明的是,当所述操作方式为右外连接,所述场景为对同比值进行排序时,同样无法优化执行计划。
作为一种较优的实施方式,本发明实施例中,当所述操作方式为内连接,所述场景为对汇总值不进行排序或对维度进行排序时,所述将汇总和/或limit操作按照预设的策略下推,生成执行计划包括:
将排序字段设置为与分析维度一致,对左表和右表的结果集进行排序,并则将所述limit操作中的limit值按照预设的放大比例放大,将放大后的所述limit操作下推到数据库中。
具体的,内连接(Inner join)要求左表和右表中的关联字段匹配才会返回。因为是需要左表和右表完全匹配才算是成功,因此需要左右列表的汇总结果集是有序和确定的,因此,当操作方式为内连接,场景为对汇总值不进行排序或对维度进行排序时,需要在对左表和右表limit操作下推时对结果集进行排序,排序字段要和分析维度一致。除此之外,在进行limit下推时需要对limit值放大。具体操作时,可以先预先设置放大比例,然后将limit值按照预设的放大比例放大,再将放大后的limit操作下推到数据库中。
作为一种较优的实施方式,本发明实施例中,当所述操作方式为内连接,所述场景为对汇总值进行排序时,所述将汇总和/或limit操作按照预设的策略下推,生成执行计划包括:
将所述limit操作中的limit值按照预设的放大比例放大,将放大后的所述limit操作下推到对汇总值进行排序的表中,获取返回的第三结果集;
将所述第三结果集中的维度值作为过滤条件传至另一个表中进行过滤汇总,获取返回的第四结果集;
将所述第三结果集与所述第四结果集进行匹配,返回匹配成功的结果集。
具体的,对汇总值进行排序包括对本期汇总值进行排序或对同期汇总值进行排序。由于不管是对左表中的汇总值进行排序还是对右表中的汇总值进行排序,都需要将limit值放大,然后对对应表(即对汇总值进行排序的表)进行limit下推汇总,将返回结果集(即第三结果集)中的维度值作为过滤条件传到另外一个表中进行过滤汇总,获取返回的第四结果集。将两个结果集(即第三结果集和第四结果集)进行匹配,返回匹配成功的结果集。
图5是根据一示例性实施例示出的执行计划的优化装置的结构示意图,参照图5所示,该装置包括:
数据解析模块,用于获取查询请求,解析出所述查询请求所采用的操作方式以及对应的场景,其中所述操作方式包括全外连接、联合、左外连接、右外连接以及内连接;
计划生成模块,用于结合所述操作方式以及所述场景,将汇总和/或limit操作按照预设的策略下推,生成执行计划;
操作执行模块,用于按照所述执行计划在数据库中执行相应操作,输出查询结果。
作为一种较优的实施方式,本发明实施例中,所述计划生成模块包括:
数据排序单元,用于对同期结果集以及本期结果集按照分析维度的组合进行排序后;
操作下推单元,用于将所述limit操作下推到数据库中。
作为一种较优的实施方式,本发明实施例中,所述计划生成模块还包括:
检验单元,用于检验排序字段与分析维度是否一致;
维度设置单元,用于将所述排序字段设置为与所述分析维度一致;
所述排序单元还用于对所述维度重新进行排序。
作为一种较优的实施方式,本发明实施例中,所述计划生成模块还包括:
汇总计算单元,用于对汇总值进行排序的结果集进行汇总计算后;
所述操作下推单元还用于将所述汇总和所述limit操作均下推到数据库中,获取返回的第一结果集;
条件传送单元,用于将所述第一结果集中的维度值作为过滤条件传给其余结果集,获取返回的第二结果集;
结果匹配单元,用于将所述第二结果集与所述第一结果集进行匹配,将匹配成功的结果补充至所述第一结果集中,生成最终的结果集。
作为一种较优的实施方式,本发明实施例中,所述操作下推单元还用于将所述汇总操作、所述limit操作以及过滤操作直接下推到左表中,获取左表返回的结果集;
所述条件传送单元还用于将所述左表返回的结果集中的维度值作为过滤条件,传到右表中;
所述结果匹配单元还用于将右表的汇总结果与所述左表返回的结果集进行匹配,生成最终的结果集。
作为一种较优的实施方式,本发明实施例中,所述计划生成模块还包括:
参数设置单元,用于设置下推参数以及放大比例;
判断单元,用于根据所述下推参数判断是否满足下推的条件;
放大单元,用于将所述limit操作中的limit值按照所述放大比例放大;
所述操作下推单元还用于将放大后的所述limit操作与排序操作下推到右表中,获取右表返回的结果集;
所述条件传送单元还用于将所述右表返回的结果集中的维度值作为过滤条件,传到左表中;
所述结果匹配单元还用于将左表的汇总结果与所述右表返回的结果集进行匹配,生成最终的结果集。
作为一种较优的实施方式,本发明实施例中,所述操作下推单元还用于将所述汇总操作、所述limit操作以及过滤操作直接下推到右表中,获取右表返回的结果集。
作为一种较优的实施方式,本发明实施例中,所述操作下推单元还用于将放大后的所述limit操作与排序操作下推到左表中,获取左表返回的结果集。
作为一种较优的实施方式,本发明实施例中,所述数据排序单元还用于对左表和右表的结果集进行排序。
作为一种较优的实施方式,本发明实施例中,所述操作下推单元还用于将放大后的所述limit操作下推到对汇总值进行排序的表中,获取返回的第三结果集;
所述条件传送单元还用于将所述第三结果集中的维度值作为过滤条件传至另一个表中进行过滤汇总,获取返回的第四结果集;
所述结果匹配单元还用于将所述第三结果集与所述第四结果集进行匹配,返回匹配成功的结果集。
图6是根据一示例性实施例示出的计算机设备的内部结构示意图,参照图6所示,该计算机设备包括通过系统总线连接的处理器、存储器和网络接口。其中,该计算机设备的处理器用于提供计算和控制能力。该计算机设备的存储器包括非易失性存储介质、内存储器。该非易失性存储介质存储有操作系统、计算机程序和数据库。该内存储器为非易失性存储介质中的操作系统和计算机程序的运行提供环境。该计算机设备的网络接口用于与外部的终端通过网络连接通信。该计算机程序被处理器执行时以实现一种执行计划的优化方法。
本领域技术人员可以理解,图6中示出的结构,仅仅是与本发明方案相关的部分结构的框图,并不构成对本发明方案所应用于其上的计算机设备的限定,具体的计算机设备可以包括比图中所示更多或更少的部件,或者组合某些部件,或者具有不同的部件布置。
作为一种较优的实施方式,本发明实施例中,计算机设备包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,处理器执行计算机程序时实现以下步骤:
获取查询请求,解析出所述查询请求所采用的连接操作的操作方式以及对应的场景,其中所述操作方式包括全外连接、左外连接、右外连接以及内连接;
结合所述操作方式以及所述场景,将汇总和/或limit操作按照预设的策略下推,生成执行计划;
按照所述执行计划在数据库中执行相应操作,输出查询结果。
作为一种较优的实施方式,本发明实施例中,当所述操作方式为全外连接或联合,所述场景为对汇总值不进行排序时,在处理器执行计算机程序实现上述的将汇总和/或limit操作按照预设的策略下推,生成执行计划的步骤时,具体实现以下步骤:
对同期结果集以及本期结果集按照分析维度的组合进行排序后,将所述limit操作下推到数据库中。
作为一种较优的实施方式,本发明实施例中,当所述操作方式为全外连接或联合,所述场景为对维度进行排序时,在处理器执行计算机程序实现上述的将汇总和/或limit操作按照预设的策略下推,生成执行计划的步骤时,具体实现以下步骤:
检验排序字段与分析维度是否一致,若不一致,则将所述排序字段设置为与所述分析维度一致,对所述维度重新进行排序后,将所述limit操作下推到数据库中。
作为一种较优的实施方式,本发明实施例中,当所述操作方式为全外连接或联合,所述场景为对汇总值进行排序时,在处理器执行计算机程序实现上述的将汇总和/或limit操作按照预设的策略下推,生成执行计划的步骤时,具体实现以下步骤:
对汇总值进行排序的结果集进行汇总计算后,将所述汇总和所述limit操作均下推到数据库中,获取返回的第一结果集;
将所述第一结果集中的维度值作为过滤条件传给其余结果集,获取返回的第二结果集;
将所述第二结果集与所述第一结果集进行匹配,将匹配成功的结果补充至所述第一结果集中,生成最终的结果集。
作为一种较优的实施方式,本发明实施例中,当所述操作方式为左外连接,所述场景为对汇总值不进行排序或对维度进行排序或对左表中的汇总值进行排序时,在处理器执行计算机程序实现上述的将汇总和/或limit操作按照预设的策略下推,生成执行计划的步骤时,具体实现以下步骤:
将所述汇总操作、所述limit操作以及过滤操作直接下推到左表中,获取左表返回的结果集;
将所述左表返回的结果集中的维度值作为过滤条件,传到右表中,将右表的汇总结果与所述左表返回的结果集进行匹配,生成最终的结果集。
作为一种较优的实施方式,本发明实施例中,当所述操作方式为左外连接,所述场景为对右表中的汇总值进行排序时,在处理器执行计算机程序实现上述的将汇总和/或limit操作按照预设的策略下推,生成执行计划的步骤时,具体实现以下步骤:
设置下推参数以及放大比例;
根据所述下推参数判断是否满足下推的条件,若满足,则将所述limit操作中的limit值按照所述放大比例放大;
将放大后的所述limit操作与排序操作下推到右表中,获取右表返回的结果集;
将所述右表返回的结果集中的维度值作为过滤条件,传到左表中,将左表的汇总结果与所述右表返回的结果集进行匹配,生成最终的结果集。
作为一种较优的实施方式,本发明实施例中,当所述操作方式为右外连接,所述场景为对汇总值不进行排序或对维度进行排序或对右表中的汇总值进行排序时,在处理器执行计算机程序实现上述的将汇总和/或limit操作按照预设的策略下推,生成执行计划的步骤时,具体实现以下步骤:
将所述汇总操作、所述limit操作以及过滤操作直接下推到右表中,获取右表返回的结果集;
将所述右表返回的结果集中的维度值作为过滤条件,传到左表中,将左表的汇总结果与所述右表返回的结果集进行匹配,生成最终的结果集。
作为一种较优的实施方式,本发明实施例中,当所述操作方式为右外连接,所述场景为对左表中的汇总值进行排序时,在处理器执行计算机程序实现上述的将汇总和/或limit操作按照预设的策略下推,生成执行计划的步骤时,具体实现以下步骤:
根据下推参数判断是否满足下推的条件,若满足,则将所述limit操作中的limit值按照预设的放大比例放大;
将放大后的所述limit操作与排序操作下推到左表中,获取左表返回的结果集;
将所述左表返回的结果集中的维度值作为过滤条件,传到右表中,将右表的汇总结果与所述左表返回的结果集进行匹配,生成最终的结果集。
作为一种较优的实施方式,本发明实施例中,当所述操作方式为内连接,所述场景为对汇总值不进行排序或对维度进行排序时,在处理器执行计算机程序实现上述的将汇总和/或limit操作按照预设的策略下推,生成执行计划的步骤时,具体实现以下步骤:
将排序字段设置为与分析维度一致,对左表和右表的结果集进行排序,并则将所述limit操作中的limit值按照预设的放大比例放大,将所述放大后的limit操作下推到数据库中。
作为一种较优的实施方式,本发明实施例中,当所述操作方式为内连接,所述场景为对汇总值进行排序时,在处理器执行计算机程序实现上述的将汇总和/或limit操作按照预设的策略下推,生成执行计划的步骤时,具体实现以下步骤:
将所述limit操作中的limit值按照预设的放大比例放大,将所述放大后的limit操作下推到对汇总值进行排序的表中,获取返回的第三结果集;
将所述第三结果集中的维度值作为过滤条件传至另一个表中进行过滤汇总,获取返回的第四结果集;
将所述第三结果集与所述第四结果集进行匹配,返回匹配成功的结果集。
本发明实施例中,还提供了一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时,实现如下步骤:
获取查询请求,解析出所述查询请求所采用的连接操作的操作方式以及对应的场景,其中所述操作方式包括全外连接、左外连接、右外连接以及内连接;
结合所述操作方式以及所述场景,将汇总和/或limit操作按照预设的策略下推,生成执行计划;
按照所述执行计划在数据库中执行相应操作,输出查询结果。
作为一种较优的实施方式,本发明实施例中,当所述操作方式为全外连接或联合,所述场景为对汇总值不进行排序时,在计算机程序被处理器执行实现上述的将汇总和/或limit操作按照预设的策略下推,生成执行计划的步骤时,具体实现以下步骤:
对同期结果集以及本期结果集按照分析维度的组合进行排序后,将所述limit操作下推到数据库中。
作为一种较优的实施方式,本发明实施例中,当所述操作方式为全外连接或联合,所述场景为对维度进行排序时,在计算机程序被处理器执行实现上述的将汇总和/或limit操作按照预设的策略下推,生成执行计划的步骤时,具体实现以下步骤:
检验排序字段与分析维度是否一致,若不一致,则将所述排序字段设置为与所述分析维度一致,对所述维度重新进行排序后,将所述limit操作下推到数据库中。
作为一种较优的实施方式,本发明实施例中,当所述操作方式为全外连接或联合,所述场景为对汇总值进行排序时,在计算机程序被处理器执行实现上述的将汇总和/或limit操作按照预设的策略下推,生成执行计划的步骤时,具体实现以下步骤:
对汇总值进行排序的结果集进行汇总计算后,将所述汇总和所述limit操作均下推到数据库中,获取返回的第一结果集;
将所述第一结果集中的维度值作为过滤条件传给其余结果集,获取返回的第二结果集;
将所述第二结果集与所述第一结果集进行匹配,将匹配成功的结果补充至所述第一结果集中,生成最终的结果集。
作为一种较优的实施方式,本发明实施例中,当所述操作方式为左外连接,所述场景为对汇总值不进行排序或对维度进行排序或对左表中的汇总值进行排序时,在计算机程序被处理器执行实现上述的将汇总和/或limit操作按照预设的策略下推,生成执行计划的步骤时,具体实现以下步骤:
将所述汇总操作、所述limit操作以及过滤操作直接下推到左表中,获取左表返回的结果集;
将所述左表返回的结果集中的维度值作为过滤条件,传到右表中,将右表的汇总结果与所述左表返回的结果集进行匹配,生成最终的结果集。
作为一种较优的实施方式,本发明实施例中,当所述操作方式为左外连接,所述场景为对右表中的汇总值进行排序时,在计算机程序被处理器执行实现上述的将汇总和/或limit操作按照预设的策略下推,生成执行计划的步骤时,具体实现以下步骤:
设置下推参数以及放大比例;
根据所述下推参数判断是否满足下推的条件,若满足,则将所述limit操作中的limit值按照所述放大比例放大;
将所述放大后的limit操作与排序操作下推到右表中,获取右表返回的结果集;
将所述右表返回的结果集中的维度值作为过滤条件,传到左表中,将左表的汇总结果与所述右表返回的结果集进行匹配,生成最终的结果集。
作为一种较优的实施方式,本发明实施例中,当所述操作方式为右外连接,所述场景为对汇总值不进行排序或对维度进行排序或对右表中的汇总值进行排序时,在计算机程序被处理器执行实现上述的将汇总和/或limit操作按照预设的策略下推,生成执行计划的步骤时,具体实现以下步骤:
将所述汇总操作、所述limit操作以及过滤操作直接下推到右表中,获取右表返回的结果集;
将所述右表返回的结果集中的维度值作为过滤条件,传到左表中,将左表的汇总结果与所述右表返回的结果集进行匹配,生成最终的结果集。
作为一种较优的实施方式,本发明实施例中,当所述操作方式为右外连接,所述场景为对左表中的汇总值进行排序时,在计算机程序被处理器执行实现上述的将汇总和/或limit操作按照预设的策略下推,生成执行计划的步骤时,具体实现以下步骤:
根据下推参数判断是否满足下推的条件,若满足,则将所述limit操作中的limit值按照预设的放大比例放大;
将所述放大后的limit操作与排序操作下推到左表中,获取左表返回的结果集;
将所述左表返回的结果集中的维度值作为过滤条件,传到右表中,将右表的汇总结果与所述左表返回的结果集进行匹配,生成最终的结果集。
作为一种较优的实施方式,本发明实施例中,当所述操作方式为内连接,所述场景为对汇总值不进行排序或对维度进行排序时,在计算机程序被处理器执行实现上述的将汇总和/或limit操作按照预设的策略下推,生成执行计划的步骤时,具体实现以下步骤:
将排序字段设置为与分析维度一致,对左表和右表的结果集进行排序,并则将所述limit操作中的limit值按照预设的放大比例放大,将所述放大后的limit操作下推到数据库中。
作为一种较优的实施方式,本发明实施例中,当所述操作方式为内连接,所述场景为对汇总值进行排序时,在计算机程序被处理器执行实现上述的将汇总和/或limit操作按照预设的策略下推,生成执行计划的步骤时,具体实现以下步骤:
将所述limit操作中的limit值按照预设的放大比例放大,将所述放大后的limit操作下推到对汇总值进行排序的表中,获取返回的第三结果集;
将所述第三结果集中的维度值作为过滤条件传至另一个表中进行过滤汇总,获取返回的第四结果集;
将所述第三结果集与所述第四结果集进行匹配,返回匹配成功的结果集。
综上所述,本发明实施例提供的技术方案带来的有益效果是:
本发明实施例提供的执行计划的优化方法、装置、计算机设备以及计算机可读存储介质,通过将汇总、limit等操作下推到olap数据库中,充分利用了olap(联机分析处理)数据库的优化特性,一方面,使得olap数据库的计算量明显减少,提升性能、并发性和资源利用率,另一方面,从olap数据库中返回到SQL引擎的数据量明显减少,减少了网络传输压力,且使得spark等SQL引擎的性能、并发性和资源里有了显著提高;避免了在高基数汇总时存在的限制以及spark SQL、presto等SQL引擎在进行大数据量多表join时的性能问题;且对于一些基数非常高的汇总查询,因为要返回全量数据,olap数据库可能无法及时处理,但是通过本方案,则可以在规定的响应时间内能够查询出数据。
需要说明的是:上述实施例提供的执行计划的优化装置在触发优化业务时,仅以上述各功能模块的划分进行举例说明,实际应用中,可以根据需要而将上述功能分配由不同的功能模块完成,即将装置的内部结构划分成不同的功能模块,以完成以上描述的全部或者部分功能。另外,上述实施例提供的执行计划的优化装置与执行计划的优化方法实施例属于同一构思,即该装置是基于该执行计划的优化方法的,其具体实现过程详见方法实施例,这里不再赘述。
本领域普通技术人员可以理解实现上述实施例的全部或部分步骤可以通过硬件来完成,也可以通过程序来指令相关的硬件完成,所述的程序可以存储于一种非易失性计算机可读存储介质中,该计算机程序在执行时,可包括如上述各方法的实施例的流程上述提到的存储介质可以是只读存储器,磁盘或光盘等。
以上所述仅为本发明的较佳实施例,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。