一种对输出列进行合并计算的方法技术

技术编号:16873810 阅读:34 留言:0更新日期:2017-12-23 11:45
本发明专利技术涉及数据库查询优化领域,公开了一种对输出列进行合并计算的方法,包括以下步骤:S100、改写各个输出列表达式:将运算表达式按照运算的交换律以及列的ID进行改写,使得对于一个列的集合和表达式最终能生成一个唯一的表达式;S200、初始化各个输出列表达式:对于各个输出列表达式,转换成二叉树进行后续遍历,计算当前表达式中出现的表中列的集合以及表达式的深度;S300、根据各个输出列的最终深度进行排序;S400、标记输出列之间的表达式共享关系,并将其结果存入表达式;S500、根据步骤S400生成的表达式共享关系,在输出列表达式之间直接设置中间状态的共享。本发明专利技术最终实现减少了CPU的使用率,从而提高了整个查询计划的执行效率。

A method of merging the output columns

The present invention relates to the field of database query optimization and discloses a method for the combined calculation of the output column, which comprises the following steps: S100, rewrite each output type: list of expressions in accordance with the exchange law operation and column ID rewrite for collection and expression of a column will eventually generate a unique the expression of S200, the output list; initialization expression: for each output list of, converted into two binary tree traversal for subsequent calculation, the current expression in table column sets and the expression depth; S300, sorted according to the final depth of each output column; sharing relationship expression between the markers S400 and output the column, which results in expression; S500, sharing relationship according to the expression step S400 generated in the output list, was located directly between Share the intermediate state. The invention ultimately reduces the use of CPU, thus improving the efficiency of the execution of the entire query plan.

【技术实现步骤摘要】
一种对输出列进行合并计算的方法
本专利技术涉及数据库查询优化领域,特别是涉及一种对输出列进行合并计算的方法。
技术介绍
目前,在数据库处理SQL的过程主要分为三个阶段:一、分析阶段:在这个阶段,数据库将来自客户端的标准结构化的查询语句(SQL),借助词法语法解析工具转换成数据库可以识别的数据结构——语法分析树。二、查询优化阶段:数据库在语法分析树上面施加各种优化的方法(也就是数据库中常见的查询改写),然后为参与连接的表计算出一条最优的访问路径,最终生成一个结构来表示最优的查询计划。三、执行查询计划阶段,执行最优的查询计划,最终获得结果。在查询优化阶段,会将谓词尽可能下推到底层的表,然后计算谓词的选择率,从而确定每个表的访问方法,最终使用动态规划算法最终获得一个最优的表的连接路径。这个连接路径基本上确定了整个查询计划。随着目前数据处理技术的不断变化,数据库中SQL也变成更加复杂,输出列的计算相应的占用了大量的CPU时间。因此有必要对输出列进行处理,以提高计算的效率。目前的数据库中,某些数据库已经实现了对下面场景的优化:假设SQL为SELECTSUM(X),AVG(X)FROMT1,在计算AVG(X)的时候,实际上是已经能获得SUM(X)的,因此可以省去计算SUM(X)。但是,对于更加复杂的情况,比如:SELECTSUM(X+Y),AVG((X+Y)*Z)FROMT1,目前的优化措施无法让两个表达式共享中间计算结果,因此会造成多次计算某些表达式而浪费了CPU资源。
技术实现思路
本专利技术针对现有技术中计算资源占有率大的缺点,提供了一种对输出列进行合并计算的方法。为了解决上述技术问题,本专利技术通过下述技术方案得以解决。一种对输出列进行合并计算的方法,包括如下步骤:S100、改写各个输出列表达式:将运算表达式按照运算的交换律以及列的ID进行改写,使得对于一个列的集合和表达式最终能生成一个唯一的表达式;S200、初始化各个输出列表达式:对于各个输出列表达式,转换成二叉树进行后续遍历,计算当前表达式中出现的表中列的集合以及表达式的深度;S300、根据各个输出列的最终深度进行排序;S400、标记输出列之间的表达式共享关系,并将其结果存入表达式;S500、根据步骤S400生成的表达式共享关系,在输出列表达式之间直接设置中间状态的共享。作为优选,步骤S400中,还包括:S410、初始化两个集合,一个集合是已处理的表达式的集合,一个是未处理的表达式的集合,将所有的输出列表达式放入未处理的表达式集合;S411、判断未处理的表达式集合是否为空,为空则直接退出;不为空,则进入下一步;S412、从未处理的表达式集合中取出深度最深的表达式,假设该表达式的深度为K;S413、从未处理的表达式集合中,按照深度递减的顺序取出其他表达式;S414、判断未处理的表达式集合中是否还有其他表达式,如果有,则取出深度为K—N的表达式,则进入步骤S415;如不存在,则进入步骤S418;S415、寻找深度为K和K—N的表达式是否存在共同的表达式:两个表达式相同需要满足两个条件:a、左右子表达式相同,如表达式是引用的列,则需要表达式所引用的列也最终相同;如表达式是常量,则需要常量也相同;b、表达式的操作符相同;S416、判断二者是否存在共享的表达式:如不存在,则回到步骤S413,处理下一个深度的表达式;如存在,则进入步骤S417;S417、标注两个表达式的子表达式共享关系,返回步骤S413;S418、将当前深度为K的表达式从未处理表达式集合中删除。本专利技术由于采用了以上技术方案,具有显著的技术效果:本专利技术提供了对输出列表达式进行合并计算的方法,使得最终在计算输出列的时候,能够共享一些表达式的结果,从而消除了重复执行一些表达式的开销,最终实现减少了CPU的使用率,从而提高了整个查询计划的执行效率。附图说明图1是本专利技术一种对输出列进行合并计算的方法中的流程图;图2是本专利技术一种对输出列进行合并计算的方法中的标记输出列的表达式共享关系的流程图;图3是本专利技术一种对输出列进行合并计算的方法中求总和的二叉树数据结构示意图;图4是本专利技术一种对输出列进行合并计算的方法中求总平均值的二叉树数据结构示意图。具体实施方式下面通过附图和实施例对本专利技术作进一步详细描述。如图1至图4所示,一种对输出列进行合并计算的方法,包括如下步骤:S100、改写各个输出列表达式:将运算表达式按照运算的交换律以及列的ID进行改写,使得对于一个列的集合和表达式最终能生成一个唯一的表达式;S200、初始化各个输出列表达式:对于各个输出列表达式,转换成二叉树进行后续遍历,计算当前表达式中出现的表中列的集合以及表达式的深度;S300、根据各个输出列的最终深度进行排序;S400、标记输出列之间的表达式共享关系,并将其结果存入表达式;S500、根据步骤S400生成的表达式共享关系,在输出列表达式之间直接设置中间状态的共享。作为优选,步骤S400中,还包括:S410、初始化两个集合,一个集合是已处理的表达式的集合,一个是未处理的表达式的集合,将所有的输出列表达式放入未处理的表达式集合;S411、判断未处理的表达式集合是否为空,为空则直接退出;不为空,则进入下一步;S412、从未处理的表达式集合中取出深度最深的表达式,假设该表达式的深度为K;S413、从未处理的表达式集合中,按照深度递减的顺序取出其他表达式;S414、判断未处理的表达式集合中是否还有其他表达式,如果有,则取出深度为K—N的表达式,则进入步骤S415;如不存在,则进入步骤S418;S415、寻找深度为K和K—N的表达式是否存在共同的表达式:两个表达式相同需要满足两个条件:a、左右子表达式相同,如表达式是引用的列,则需要表达式所引用的列也最终相同;如表达式是常量,则需要常量也相同;b、表达式的操作符相同;S416、判断二者是否存在共享的表达式:如不存在,则回到步骤S413,处理下一个深度的表达式;如存在,则进入步骤S417;S417、标注两个表达式的子表达式共享关系,返回步骤S413;S418、将当前深度为K的表达式从未处理表达式集合中删除。本专利技术提供了对输出列表达式进行合并计算的方法,使得最终在计算输出列的时候,能够共享一些表达式的结果,从而消除了重复执行一些表达式的开销,最终实现减少了CPU的使用率,从而提高了整个查询计划的执行效率。实施例1在表T1中存在列X、Y、和Z,并且在数据库内部的元数据中,X的ID小于Y的ID,Y的ID小于Z的ID,当前需要处理如下的SQL:SELECTSUM(X+Y),AVG((X+Y)*Z)FROMT1。在数据库内部,对该SQL经过分析阶段之后得到一个语法分析树,然后进过查询优化得到一个最优的访问路径,该访问路径主要是确定需要全表扫描T1表。接下来,施加本专利技术的处理过程:1、改写输出表达式,主要是根据运算交换律以及列的ID进行改写表达式,可以采用按照ID进行升序改写,或是降序改写,不管采用哪种排序,都不影响本专利技术的实施。如果采用列ID降序改写,则SUM(X+Y)需要改写成SUM(Y+X),AVG((X+Y)*Z)改写成AVG(Z*(Y+X))。在本实施例中,采用ID升序改写,故输入的表达式和输出的表达式相同。2、初始本文档来自技高网...
一种对输出列进行合并计算的方法

【技术保护点】
一种对输出列进行合并计算的方法,其特征在于,包括如下步骤:S100、改写各个输出列表达式:将运算表达式按照运算的交换律以及列的ID进行改写,使得对于一个列的集合和表达式最终能生成一个唯一的表达式;S200、初始化各个输出列表达式:对于各个输出列表达式,转换成二叉树进行后续遍历,计算当前表达式中出现的表中列的集合以及表达式的深度;S300、根据各个输出列的最终深度进行排序;S400、标记输出列之间的表达式共享关系,并将其结果存入表达式;S500、根据步骤S400生成的表达式共享关系,在输出列表达式之间直接设置中间状态的共享。

【技术特征摘要】
1.一种对输出列进行合并计算的方法,其特征在于,包括如下步骤:S100、改写各个输出列表达式:将运算表达式按照运算的交换律以及列的ID进行改写,使得对于一个列的集合和表达式最终能生成一个唯一的表达式;S200、初始化各个输出列表达式:对于各个输出列表达式,转换成二叉树进行后续遍历,计算当前表达式中出现的表中列的集合以及表达式的深度;S300、根据各个输出列的最终深度进行排序;S400、标记输出列之间的表达式共享关系,并将其结果存入表达式;S500、根据步骤S400生成的表达式共享关系,在输出列表达式之间直接设置中间状态的共享。2.根据权利要求1所述的一种对输出列进行合并计算的方法,其特征在于:步骤S400中,还包括:S410、初始化两个集合,一个集合是已处理的表达式的集合,一个是未处理的表达式的集合,将所有的输出列表达式放入未处理的表达式集合;S411、判断未处理的表达式集合是否为空...

【专利技术属性】
技术研发人员:余鹏李建辉熊中哲魏兴华臧冰凌李春陈栋张文件罗春
申请(专利权)人:杭州沃趣科技股份有限公司
类型:发明
国别省市:浙江,33

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1