Postgresql慢速数组赋值

时间:2015-09-21 18:24:09

标签: arrays performance postgresql function stored-procedures

我正在使用postgresql中的存储过程/函数。我有一个名为sports的表,我有一系列运动%ROWTYPE:

records = "sports"[10000];

我还有一个循环(10 000次迭代),我在其中创建一条记录并将其分配给记录数组:

for idx in ....
loop
   record.x = something;
   record.y = something_else

   records[idx] = record;
end loop;

由于某种原因,语句records[idx] = record;需要超过20秒才能执行(对于10 000次迭代)。

我不知道为什么这项任务花了这么长时间。

修改

我有一个包含3个参数的存储过程

x text;
y integer[][];
z integer[];

我的目标是将这些数据存储在如下表格中:

x | y[0]  | z[0]
x | y[1]  | z[1]
x | y[..] | z[..]
x | y[n]  | z[n]

1 个答案:

答案 0 :(得分:0)

PostgreSQL通常不会就地修改数组。当你修改一个时,它会被复制以制作新的。

您应该避免尝试迭代地构建或修改数组。而是使用集合。在这种情况下,我将定义一个函数来构建一个记录,我用array_agg来调用它来创建数组,比如

select array_agg(r)
from generate_series(1,10000) i,
     my_function(whatever_input_you_need)
into records;

如果你可以通过使用ROW(...)构造函数来定义函数,那就更好了,例如:

select array_agg(ROW(col1, col2, col3))
from generate_series(1,10000) i,
     my_function(whatever_input_you_need);

DanielVérténoted that this has changed for arrays modified in plpgsql in PostgreSQL 9.5,所以它应该更有效率。在9.5上你的代码可能会运行正常,看到差异会很有趣。