选择与unfst结合的postgresql数组元素时会消耗大量内存

时间:2016-03-29 08:04:02

标签: postgresql

当我在Postgresql 9.5中创建一个临时表时,其中一行包含一个非常小的int数组

select array_agg(t.i) ids into temp table tmp1 from (select generate_series(1,100000) i) t;

以下查询使用了数十亿字节的内存(以及大量时间):

select ids[1] id_to, unnest(ids) id_from into temp table tmp2 from tmp1;

我没想到这一点,并且想了解为什么选择一个数组元素和一个不需要的资源需要这么多资源。没有选择ID [1]一切都很顺利。

作为一种解决方法,我使用它,这是一种节省内存和快速的方法:

select array_agg(t.i) ids into temp table tmp1 from (select generate_series(1,80000) i) t;
alter table tmp1 add column id1 int;
update tmp1 set id1 = ids[1];
select id1 id_to, unnest(ids) id_from into temp table tmp2 from tmp1;

1 个答案:

答案 0 :(得分:0)

好吧,你的内存消耗查询可能会为unnest(ids)中的每一行实例化一次大数组,然后从中提取第一个元素。我不知道它还能做些什么。

我想可能会有一个优化,注意到这是一个常数,但这通常不会是真的,所以它不是你想要的那种东西。

你也可以这样做:

WITH first AS (SELECT ids[1] AS elem1 FROM tmp1) 
SELECT elem1, unnest(ids) FROM tmp1, first;

我很好奇你的用例。通常,如果要访问数组的各个元素,则可能需要单独的表和连接。