解析数仓 OLAP 函数:ROLLUP、CUBE、GROUPING SETS
本文分享自华为云社区《GaussDB(DWS) OLAP函数浅析》,作者: DWS_Jack_2。
在一些报表场景中,经常会对数据做分组统计(group by),例如对一级部门下辖的二级部门员工数进行统计
常见的统计报表业务中,通常需要进一步计算一级部门的“合计”人数,也就是二级部门各分组的累加,就可以借助于 rollup,如下所示,比前面的分组计算结果多了一行合计的数据
如上是一种 group by 扩展的高级分组函数使用场景,这一类分组函数统称为 OLAP 函数,在 GaussDB(DWS)中支持 ROLLUP,CUBE,GROUPING SETS,下面对这几种 OLAP 函数的原理和应用场景做一下分析。
首先我们来创建一张表,customer,用户信息表,其中包含了用户 id,用户名,年龄,国家,用户级别,性别,余额等信息
ROLLUP
本文开头的示例已经解释了,ROLLUP 是在分组计算基础上增加了合计,从字面意思理解,就是从最小聚合级开始,聚合单位逐渐扩大,例如如下语句
该语句功能等价于如下
尝试理解一下
GROUP BY ROLLUP(A,B):
首先对(A,B)进行 GROUP BY,然后对(A)进行 GROUP BY,最后对全表进行 GROUP BY 操作
CUBE
CUBE 从字面意思理解,就是各个维度的意思,也就是说全部组合,即聚合键中所有字段的组合的分组统计结果,例如如下语句
该语句功能等价于如下
理解一下
GROUP BY CUBE(A,B):
首先对(A,B)进行 GROUP BY,然后依次对(A)、(B)进行 GROUP BY,最后对全表进行 GROUP BY 操作。
GROUPING SETS
GROUPING SETS 区别于 ROLLUP 和 CUBE,并没有总体的合计功能,相当于从 ROLLUP 和 CUBE 的结果中提取出部分记录,例如如下语句
该语句功能等价于如下
理解一下
GROUP BY GROUPING SETS(A,B):
分别对(B)、(A)进行 GROUP BY 计算
目前在 GaussDB(DWS)中,OLAP 函数的实现,会有排序(sort)操作,相比等价的 union all 操作,效率并不会有提升,后续会通过 mixagg 的支持来提升 OLAP 函数的执行效率,有兴趣的同学,可以 explain 打印一下计划,来看一下 OLAP 函数的执行流程。
版权声明: 本文为 InfoQ 作者【华为云开发者社区】的原创文章。
原文链接:【http://xie.infoq.cn/article/689acce2b492b1835326f521f】。文章转载请联系作者。
评论