PostgreSQL 多个数组聚合为一维数组加速(array_agg)
发布时间:2020-12-13 16:41:43 所属栏目:百科 来源:网络整理
导读:点击有惊喜 标签 PostgreSQL,array_agg,arragg 背景 多个数组聚合为一维数组,求PC。业务背景见: 《PostgreSQL APP海量FEED LOG实时质量统计CASE(含percentile_disc)》 由于PostgreSQL内置的聚合函数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,255);">3]),(4,255);">5,255);">6])) t(arr);
array_agg
-------------------
{{3},{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(6])) t(arr);
arragg
---------------
{3,255);">6}
( 但是这个新加的聚合用到了array_cat,大量的memcpy导致性能并不好。
3、unnest聚合,耗时0.59秒517.50..517.51 rows=32) (actual time=520.327..520.327 rows=1)
Output: $0
InitPlan 1 (returns $0)
-> ProjectSet (cost=0.00..517.50 rows=100000 width=4) (actual 11.979..223.223 rows=1000000 loops=1)
Output: unnest(10.00 rows=0) (actual 11.972..27.014 rows=1)
Output: generate_series
Function Call: generate_series(100000)
Planning time: 0.082 ms
Execution 590.976 ms
(10 rows)
点击有惊喜 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |