OLAP Group函数数据合并并行功能介绍
背景
OLAP Group函数包括Rollup()、Cube()、Grouping sets(),它们是对普通分组聚集的扩展,可以输出多级汇总结果。在GBase 8a中如果不开启并行优化,它们首先生成各级汇总数据,再将汇总数据串行逐行合并到最终结果表,本文将介绍GBase 8a对于Group函数的并行处理功能。
Rollup()函数执行过程
Rollup()函数会对维度的组合从右至左生成汇总,例如Rollup (a, b ,c)等价于下列汇总临时表做union all操作:
group by (a, b,
c)
group by (a, b)
group by (a)
group by () //表示对所有行进行聚集(不分组)
Cube()和Grouping sets()函数执行过程
Cube()和Grouping sets()与Rollup()类似,都是对简单分组聚合操作进行扩展。
Cube()对 各维度的所有组合生成汇总,如果Cube()函数包含n列,则将有2n个汇总临时表,例如Cube(a, b, c)等价于对下列汇总临时表做union all操作:
group by (a, b,
c)
group by (a, b)
group by (a, c)
group by (b, c)
group by (a)
group by (b)
group by (c)
group by () //表示对所有行进行聚集(不分组)
列参数多时,Cube()的计算量是非常大的,如果不需要对所有组合计算汇总,可以使用Grouping sets()函数对制定的组合计算汇总,例如Grouping sets((a, b), (b, c))等价于对下列汇总临时表的union all操作:
group by (a, b)
group by (b, c)
所以Rollup()、Cube()、Grouping sets()都是对汇总临时表进行数据合并(union all)的操作,提升合并操作的效能对这三个函数均有正面影响。
并行执行方式
并行执行前需要先将数据进行划分,让各个线程处理不同的数据,数据划分有两种方式:
1、横向划分
如下图所示,每个线程处理表的部分行,涉及这些行的所有列。

2、纵向划分
如下图所示,每个线程处理表的某一列,涉及该列的所有行。

在OLAP Group函数的数据合并阶段,各列的数据已经由前面的分组聚集操作准备好了,需要做的只是将数据从汇总临时表写入最终目标表,其中不涉及任何CPU运算。
这种情况下,横向划数据会导致并行线程串行写入相同的文件,这时IO将成为瓶颈,效能无法通过并行得到提升;而使用纵向划分、列间并行的方式可以有效地提升效能,不会发生IO等待。
所以,对于包含多列的OLAP Group函数的执行,使用纵向划分、列间并行的方式可以有效地提升效能,GBase 8a通过参数_gbase_parallel_olap_group_merge控制,将该参数设置为1时打开并行优化。




