一种对输出列进行合并计算的方法与流程

文档序号:13282193阅读:502来源:国知局
一种对输出列进行合并计算的方法与流程

本发明涉及数据库查询优化领域,特别是涉及一种对输出列进行合并计算的方法。



背景技术:

目前,在数据库处理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、初始化各个输出表达式,主要是遍历表达式来设置输出表达式引用的列名以及表达式的深度。对于sum(x+y),引用的列名是x和y,表达式深度为3,avg((x+y)*z)的深度为5,引用的列名是x、y、z。

3、根据输出表达式的深度,进行排序,可以是升序或是降序,无论哪种排序或是排序算法不影响本发明的实施。

4、标记输出表达式的共享关系,选择深度为5的avg((x+y)*z),寻找和深度为3的sum(x+y)之间表达式共享的关系。由于二者引用的列名有交集(xy),因此寻找两个输出表达式的二叉树数据结构内的相同的最大的子二叉树。两个输出表达式的二叉树数据结构如下图:

图3为sum(x+y)的二叉树数据结构,图4为avg((x+y)*z)的二叉树数据结构。存在着多种寻找二叉树之间相同子树的算法,不论使用哪种算法都不影响本发明的实施。对于这两个输出表达式,最终寻找到相同的子表达式是x+y,因此标记两个表达式之间存在共享的表达式。

5、设置输出表达式之间的共享。主要是在初始化输出表达式时,如果发现某个输出表达式和其他的输出表达式存在共享关系,则先去寻找是否存在对应的内存,该内存会缓存表达式的结果,如果不存在,则为其申请一块内存,如果存在则关联对应的内存。

在完成了上述措施后,在数据库执行查询计划时,先从t1中逐一取出每条记录,对于每条记录,取出x、y、z字段的值,计算输出表达式:先计算sum(x+y)中的x+y值,该表达式是共享表达式,因此计算完毕之后,一方面将x+y的值(假设是v)缓存到对应的内存块供其他表达式读取,一方面将x+y的值和上次的结果累加(即sum操作);对于avg((x+y)*z)表达式,则按照图4所示,先计算x+y,发现是共享表达式,直接去缓存的结果v,然后执行v*z,接着计算累加值(sum)和个数累加(count)。在处理完所有的记录之后,sum(x+y)的结果就是x+y累加值,而avg((x+y)*z)的结果则是用累加值除以个数的累计值即(sum的结果除以count的结果)。最终,得到该sql的输出结果。

总之,以上所述仅为本发明的较佳实施例,凡依本发明申请专利范围所作的均等变化与修饰,皆应属本发明专利的涵盖范围。

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