PostgreSQL 多个数组聚合为一维数组加速(array_agg)

819 阅读1分钟

标签 PostgreSQL , array_agg , arragg

背景 多个数组聚合为一维数组,求PC。业务背景见:

《PostgreSQL APP海量FEED LOG实时质量统计CASE(含percentile_disc)》

由于PostgreSQL内置的聚合函数array_agg支持的数组聚合实际上是将多个数组聚合为多维数组。并不是一维数组。

例如:

postgres=# select array_agg(arr) from (values(array[1,2,3]), (array[4,5,6])) t(arr);
array_agg

{{1,2,3},{4,5,6}}
(1 row)
而实际上我们要的是一维数组的结果

{1,2,3,4,5,6}
此时需要自定义一个聚合函数

create aggregate arragg (anyarray) (sfunc = array_cat, stype=anyarray, PARALLEL=safe);
效果如下

postgres=# select arragg(arr) from (values(array[1,2,3]), (array[4,5,6])) t(arr);
arragg

{1,2,3,4,5,6}
(1 row)
但是这个新加的聚合用到了array_cat,大量的memcpy导致性能并不好。

array_agg性能对比arragg 聚合100万个元素.http://click.aliyun.com/m/1000005546/