【数据库内核】物理算子之Aggregate聚合算子实现

目录

概述

Stream Aggregate算法

一、原理和伪代码描述

<1> 原理

<2> 伪代码描述

二、案例

Hash Aggregate算法

一、原理和伪代码描述

<1> 原理

<2> 伪代码描述

二、案例

聚合函数的计算模式

CompleteMode模式计算模型

PartialMode到FinalMode模式计算模型

结论


概述

聚合函数(Aggregate Function)顾名思义,就是将一组数据进行统一计算,常常用于分析型数据库中,当然在应用中是非常重要不可或缺的函数计算方式。比如我们常见的COUNT/AVG/SUM/MIN/MAX等等。本文主要讲述数据库常用的实现方式。

 

Stream Aggregate算法

一、原理和伪代码描述

<1> 原理

Stream Aggregate的计算需要保证输入数据按照Group-By列有序。在计算过程中,每当读到一个新的 Group 的值或所有数据输入完成时,便对前一个 Group 的聚合最终结果进行计算。

Stream Aggregate的输入数据需要保证同一个Group的数据连续输入,所以Stream Aggregate处理完一个Group的数据后可以立刻向上返回结果,不用像Hash Aggregate一样需要处理完所有数据后才能正确的对外返回结果。

 

<2> 伪代码描述

Stream Group算法依赖于到达的数据并且这些数据按组按列进行排序。后续伪代码如下:

clear the current aggregate results clear the current group by columns for each input row   begin     if the input row does not match the current group by columns       begin         output the aggregate results         clear the current aggregate results         set the current group by columns to the input row       end     update the aggregate results with the input row   end

 

二、案例

测试SQL如下所示

SELECT  departId,  Sum( Salary ) FROM  staff_ GROUP BY  departId

 

算法推演如下:

 

 

Hash Aggregate算法

一、原理和伪代码描述

<1> 原理

在 Hash Aggregate 的计算过程中,我们需要维护一个Hash表,Hash表的键为聚合计算的 Group-By 列,值为SQL的输出数据。

计算过程中,只需要根据每行输入数据计算出键,在 Hash 表中找到对应值进行更新即可。

 

<2> 伪代码描述

begin   calculate hash value on group by column(s)   check for a matching row in the hash table   if we do not find a match     insert a new row into the hash table   else     update the matching row with the input row end output all rows in the hash table

 

二、案例

测试SQL如下所示

SELECT  departId,  Sum( Salary ) FROM  staff_ GROUP BY  departId

 

算法推演如下:

 

 

聚合函数的计算模式

由于分布式计算的需要,对于聚合函数的计算阶段进行划分,相应定义了两种计算模式:CompleteMode,FinalMode,PartialMode。不同的计算模式下,所处理的输入值和输出值会有所差异,如下表所示:

计算模式

输入值

输出值

CompleteMode

原始数据

最终结果

FinalMode

中间结果

最终结果

PartialMode

原始数据

中间结果

 

我们还以之前的的SQL案例来说明下面的两种计算模型。

上文SQL如下所示:

SELECT  departId,  Sum( Salary ) FROM  staff_ GROUP BY  departId

 

CompleteMode模式计算模型

这个模型聚合函数的整个计算过程只有一个阶段,如图所示:

 

适用的场景如下:

比较适用于聚合列唯一值的数量相对比较多, 能聚合的数据比较少的场景下。

 

PartialMode到FinalMode模式计算模型

此时我们将聚集函数的计算过程拆成两个阶段进行,如图所示:

 

适用的场景如下:

这样做的好处是提前做了聚合运算,一部分数据已经聚合在一起,降低了网络传输数据的大小,从而提升了内存使用量和CPU利用率。

 

结论

本文主要介绍了数据库关于聚合功能常用的两种实现方式,Stream Aggregate和Hash Aggregate算法。并且描述了在分布式场景下聚合函数的计算模型。后续会讲解聚合函数与SIMD会碰撞出怎么样的火花,比较有代表性的是postgreSql Aggregate算法通过SIMD是如何实现的。

 

参考资料

  • http://mysql.taobao.org/monthly/2017/01/06/
  • https://juejin.im/post/6844903745029947399
  • https://stackoverflow.com/questions/1471147/how-do-aggregates-group-by-work-on-sql-server/1471167#1471167
  • https://techcommunity.microsoft.com/t5/sql-server/hash-aggregate/ba-p/383149
  • http://mysql.taobao.org/monthly/2017/03/09/
分享大数据行业的一些前沿技术和手撕一些开源库的源代码
微信公众号名称:技术茶馆
微信公众号ID    :    Night_ZW
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值