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

PostgreSQL一维数组聚合
本文介绍如何在PostgreSQL中实现一维数组的聚合,通过自定义聚合函数arragg替代array_agg来解决多维数组的问题,并对比两者的性能。

标签 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/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值