我正在使用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]
答案 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上你的代码可能会运行正常,看到差异会很有趣。