首页> 中国专利> 数据库中优化多个percentile_cont分析函数执行的方法

数据库中优化多个percentile_cont分析函数执行的方法

摘要

本发明涉及关系型数据库管理技术领域,尤其涉及一种数据库中优化多个percentile_cont分析函数执行的方法。本方法包括语义分析阶段解析输出列、分组获得函数组输出列、根据函数ID分组获得percentile_cont小组、将具有相同特征的输出列分到同一组内并在内部表示中标记,以及执行阶段依次执行同一组内多个percentile_cont分析函数的瞬态函数和终结函数。本方法在数据库的解析和执行阶段,充分利用操作的相关性和分析函数的数据局部性,在组内的多个分析函数之间共享数据分组排序过程,提高了SQL的执行速度和percentile_cont分析函数在数据库管理系统中的应用效能。

著录项

  • 公开/公告号CN114817308A

    专利类型发明专利

  • 公开/公告日2022-07-29

    原文格式PDF

  • 申请/专利号CN202210415805.7

  • 发明设计人 余鹏;何小栋;

    申请日2022-04-20

  • 分类号G06F16/2452;G06F16/2453;G06F16/2455;

  • 代理机构北京尚钺知识产权代理事务所(普通合伙);

  • 代理人王海荣

  • 地址 100083 北京市海淀区学院路30号科大天工大厦B座6层01室

  • 入库时间 2023-06-19 16:08:01

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2022-07-29

    公开

    发明专利申请公布

说明书

技术领域

本发明涉及关系型数据库管理(RDBMS)技术领域,尤其涉及一种数据库中优化多个percentile_cont分析函数执行的方法。

背景技术

在诸如OpenGauss之类的典型的关系型数据库管理系统中处理一个查询,通常分为下面三个阶段:

(1)词法语法分析,主要是将用户的输入文本(SQL)转化成一个内部的数据结构,一般称之为语法解析树,并验证该语法的正确性,最终得到一个表示SQL的语法解析树。

(2)查询优化,将前一阶段得到的语法解析树,进行基于规则以及基于物理代价的优化,生成一个最优的查询计划。

(3)执行查询计划,将前一阶段生成的查询计划予以执行(一般采用迭代器的方式),得到查询结果并返回给用户。

在针对数据库进行数据分析过程中,经常会用到一系列分析函数,percentile_cont就是一个常用且非常有应用价值的分析函数。percentile_cont是一种假定连续分布模型的逆分布函数,该函数具有一个百分比值和一个排序分组,并返回一个在有关排序分组的给定百分比值范围内的内插值。

然而,目前的关系型数据库中,针对多个percentile_cont分析函数还缺少有效的优化执行的方法,从而限制了percentile_cont分析函数在数据库管理系统中的应用,影响了数据库性能的发挥,降低了工作效率。

发明内容

(1)发明目的

为了克服现有技术的上述不足,提高percentile_cont分析函数在数据库管理系统中的应用效能,本发明首次提出了在数据库的解析和执行阶段,利用操作的相关性和数据局部性,对多个percentile_cont函数的执行进行优化的方案。

(2)技术方案

第一方面,本发明提供了一种数据库中优化多个percentile_cont分析函数执行的方法,包括下述步骤:

(一)语义分析阶段

(1)对输出列进行解析;

(2)对解析后的输出列进行分组,获得函数组输出列;

(3)对函数组输出列根据函数ID进行分组,获得函数ID为percentile_cont的小组;

(4)根据预设的规则对函数ID为percentile_cont的小组进行再次分组,将具有相同特征的输出列分到同一组内,并在内部表示中标记其所属的分组;

(二)执行阶段

(5)执行(4)步获得的同一组内的多个percentile_cont分析函数的瞬态函数;

(6)执行上述各percentile_cont分析函数的终结函数。

优选地,本发明方法步骤(2)中对解析后的输出列进行分组,将其分为普通字段组、常量组、表达式组、函数组输出列。

进一步地,本发明方法步骤(3)中所述函数ID是每个数据库中内置函数的编号,根据函数ID可以唯一确定某个函数。

进一步地,本发明方法步骤(4)中所述将具有相同特征的输出列分到同一组内是指将排序字段、排序方式、分组字段相同的输出列分到同一组内。

进一步地,本发明方法还包括:在步骤(5)执行同一组内的第一个percentile_cont分析函数的瞬态函数之前,预先对数据对象进行分组、排序,并将获得的有序分组数据放置在一个后续percentile_cont分析函数都能够访问到的环境中;然后逐一执行同一组内各个percentile_cont分析函数的瞬态函数;各瞬态函数依次访问上述有序分组数据,完成初始化状态的建立。

进一步地,本发明方法步骤(6)中所述执行上述各percentile_cont分析函数的终结函数,终结函数的输入来自于该函数的瞬态函数的初始化状态获得的计算结果。

进一步地,本发明方法还包括:当全部分组都处理完成后,结束流程;否则,返回执行阶段步骤(5),处理下一个分组。

第二方面,本发明还提供了一种数据库中优化多个percentile_cont分析函数执行的系统,包括:

解析模块:用于对输出列进行解析;

输出列分组模块:用于对解析后的输出列进行分组,获得函数组输出列;

函数分组模块:用于对函数组输出列根据函数ID进行分组,获得函数ID为percentile_cont的小组;

特征分组模块:用于对函数ID为percentile_cont的小组进行再次分组,将具有相同特征的输出列分到同一组内;

标记模块:用于在内部表示中标记各输出列所属的分组;

数据分组排序模块:用于对数据对象进行分组、排序,获得有序分组数据;

瞬态函数执行模块:用于执行percentile_cont分析函数的瞬态函数;

终结函数执行模块:用于执行percentile_cont分析函数的终结函数。

(3)有益效果

综上,本发明针对关系型数据库,首次提出了一种优化多个percentile_cont分析函数执行的方法,本发明在数据库的解析和执行阶段,充分利用操作的相关性和分析函数的数据局部性,在组内的多个分析函数之间共享数据分组排序过程,对多个percentile_cont函数的执行实现了优化,从而提高了SQL的执行速度和percentile_cont分析函数在数据库管理系统中的应用效能。

附图说明

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

图1为本发明方法的实施流程图。

具体实施方式

为使本发明的目的、技术方案和优点更加清楚,下面将结合具体实施例及相应的附图对本发明的技术方案进行清楚、完整地描述。显然,所描述的实施例仅是本发明一部分实施例,而不是全部的实施例,本发明还可以通过另外不同的具体实施方式加以实施或应用,本说明书中的各项细节也可以基于不同观点与应用,在没有背离本发明的精神下进行各种修饰或改变。

同时,应理解,本发明的保护范围并不局限于下述特定的具体实施方案;还应当理解,本发明实施例中使用的术语是为了描述特定的具体实施方案,而不是为了限制本发明的保护范围。

实施例1:一种在数据库中优化多个percentile_cont分析函数执行的方法

percentile_cont函数输入是两个参数:第一个是浮点型,此参数是0到1之间的一个小数,称为百分点数;第二个是不定的一维数组,这个数组是一个有序的数组,升序降序由SQL指定,此数组中的元素都是数值型的数据,例如整型或浮点型。

对于下面的例子:

SELECT color,percentile_cont(0.5)WITHIN GROUP(ORDER BY value)over(partition by color)FROM(VALUES('red',1),('red',3),('blue',2),('blue',4))v(color,value);

是对4行含有两个字段(color和value)的记录:(‘red’,1),(‘red’,3),(‘blue’,2),(‘blue’,4)在color这个字段上进行分组,这样就会得到两组:第一组是(‘red’,1),(‘red’,3);第二组是(‘blue’,2),(‘blue’,4),然后对每组的value字段进行排序,获取排在百分位为0.5的内插值。

最终输出结果是:

按照目前的percentile_cont分析函数执行方法,针对上述带有percentile_cont函数的SQL处理过程如下:

(一)词法语法分析阶段

如前面所述的流程,在此阶段中SQL处理主要是将percentile_cont函数转化为内部表示,例如函数的执行地址、参数类型等,为后续的执行阶段提供必要的元信息。

(二)查询计划执行阶段

1、对输入的数据进行分组,即对(‘red’,1),(‘red’,3),(‘blue’,2),(‘blue’,4)这4条记录进行分组处理,主要根据SQL的语义,对第一个字段值进行分组,将第一个字段值相同的记录放入同一个分组中。

2、执行窗口聚集函数的瞬态函数,即把每个分组内的每行记录作为输入,交由瞬态函数来进行处理,瞬态函数处理过程如下:

(1)当第一次调用分组内的数据时,首先创建执行环境,此执行环境后期会传递给终结函数,由终结函数在此执行环境中完成计算过程和结果输出。执行环境获取percentile_cont的第一个参数percentile,将存储的数据计数器设置为0,并创建一个排序的数据结构用来存储第二个参数中的每个数据,数据结构中记录的信息包括各分组内数据的数据类型、对齐方式、排序方式以及能够使用的内存大小等。

(2)将输入的分组内数据,存储到执行环境的排序数据结构中,并将存储的数据计数器自增1。

3、在瞬态函数处理完该组内所有数据后,对于该分组内每个数据继续调用该窗口聚集函数的终结函数,终结函数处理过程如下:

(1)在瞬态函数的执行环境中,判断是否已经完成了本分组的处理过程,若本分组的处理过程已全部完成,则直接从缓存的字段中返回结果,若本分组的处理过程尚未完成,则进入下述步骤。

(2)获取percentile以及存储的数据数量array_length,将存储在数组内的number_array按照数据排序,执行下列计算过程来计算最终的结果:

(a)若array_length为0,则返回0。

(b)若array_length大于0,则取第一个点位first_pos的值为floor(percentile*(array_length-1)),即percentile*array_length向下取整的结果,取第二个点位second_pos的值为ceiling(percentile*(array_length-1)),即percentile*array_length向上取整的结果;此时,若first_pos的值与second_pos的值相等则直接返回number_array数组的first_pos数据的值;若first_pos的值与second_pos的值不等,则分别取第一个点位数据number_array[first_pos]的值为first_val,取第二个点位数据number_array[second_pos]的值为sencond_val,再计算二者的差分比例proportion,计算公式为percentile*(array_length-1)-first_pos,最后使用first_val sencond_val proportion做一个差分:first_val+(proportion*(second_val-first_val),获得最终计算结果。

(3)将执行环境状态设置为处理完成当前分组,需接收下一个待处理分组,并将上步获得的计算结果存储到执行环境对应的字段中。

(4)返回最终的计算结果。

4、如果分组结束,则表明处理完了所有的分组,退出即可;如果分组尚未结束,则返回到第2步,继续处理下个分组的数据。

如上所述,在整个SQL的处理过程中,数据的分组和排序占据了大量的时间和计算机资源。特别是对于以下类型的SQL:

SELECT dep,percentile_cont(0.1)WITHIN GROUP(ORDER BY sal)over(partition by dep),percentile_cont(0.2)WITHIN GROUP(ORDER BY sal)over(partition by dep),percentile_cont(0.3)WITHIN GROUP(ORDER BY sal)over(partition by dep)FROM t;

表t是一个有多个字段的表,其中有两个字段:dep是部门,sal是薪水。该SQL是对员工按照部门划分之后,分别计算前10%、前20%、前30%的薪水。

对于此类SQL,前述的执行方案并未考虑多个分析函数之间共享排序分区结果,因此就会出现重复的计算。为了解决此问题,本发明对于上述包含多个percentile_cont函数的SQL进行了如下改进以提高函数执行效率。

本发明优化多个percentile_cont分析函数执行的方法包括下述步骤(参见图1):

(一)语义分析阶段

(1)对输出列进行解析。

(2)对解析后的输出列进行分组,将其分为普通字段组、常量组、表达式组、函数组输出列。

(3)对函数组输出列根据函数ID进行分组,函数ID是每个数据库中内置函数的编号,根据函数ID可以唯一确定某个函数,获得函数ID为percentile_cont的小组。

(4)根据预设的规则对函数ID为percentile_cont的小组进行再次分组,将排序字段、排序方式、分组字段相同的输出列分到同一组内,并在内部表示中标记其所属的分组。

经过前述步骤处理,我们获得了排序字段、排序方式、分组字段都相同的输出列、并且函数是percentile_cont的小组。

(二)执行阶段

在执行阶段,我们将语义分析阶段获得的同一组内的若干percentile_cont分析函数放在一起执行。

(5)在执行(4)步获得的同一组内的第一个percentile_cont分析函数的瞬态函数之前,预先对数据对象进行分组、排序,并将获得的有序分组数据放置在一个后续percentile_cont分析函数都能够访问到的环境中;然后逐一执行同一组内各个percentile_cont分析函数的瞬态函数;各瞬态函数依次访问上述有序分组数据,完成初始化状态的建立。

(6)执行上述各percentile_cont分析函数的终结函数,执行终结函数的具体过程与前述现有技术的执行过程相同,终结函数的输入来自于该函数的瞬态函数的初始化状态获得的计算结果。

(7)当全部分组都处理完成后,结束流程;否则,返回执行阶段步骤(5),处理下一个分组。

经过前述步骤处理,我们充分利用了percentile_cont分析函数的数据局部性,在组内的多个分析函数之间共享数据分组排序过程,从而大大提高了整个SQL的执行速度。

实施例2:一种数据库中优化多个percentile_cont分析函数执行的系统,包括:

解析模块:用于对输出列进行解析;

输出列分组模块:用于对解析后的输出列进行分组,获得函数组输出列;

函数分组模块:用于对函数组输出列根据函数ID进行分组,获得函数ID为percentile_cont的小组;

特征分组模块:用于对函数ID为percentile_cont的小组进行再次分组,将具有相同特征的输出列分到同一组内;

标记模块:用于在内部表示中标记各输出列所属的分组;

数据分组排序模块:用于对数据对象进行分组、排序,获得有序分组数据;

瞬态函数执行模块:用于执行percentile_cont分析函数的瞬态函数;

终结函数执行模块:用于执行percentile_cont分析函数的终结函数;

上述各模块按照实施例1技术方案运行实施。

本发明中的各个实施例采用递进的方式描述,各个实施例之间相同或相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。

以上所述仅为本发明的实施例而已,并不用于限制本发明。对于本领域技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原理之内所作的任何修改、替换等,均应包含在本发明的权利要求保护范围之内。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号