【发布时间】:2015-06-01 22:31:57
【问题描述】:
我在 Postgres 9.3.5 中创建了以下函数:
CREATE OR REPLACE FUNCTION get_result(val1 text, val2 text)
RETURNS text AS
$BODY
$Declare
result text;
BEGIN
select min(id) into result from table
where id_used is null and id_type = val2;
update table set
id_used = 'Y',
col1 = val1,
id_used_date = now()
where id_type = val2
and id = result;
RETURN result;
END;
$BODY$
LANGUAGE plpgsql VOLATILE COST 100;
当我在超过 1000 条或更多记录的循环中运行此函数时,它只会冻结并只是说“查询正在运行”。当我检查我的表时,没有任何更新。当我为一两条记录运行它时,它运行良好。
运行时的函数示例:
select get_result('123','idtype');
表格列:
id character varying(200),
col1 character varying(200),
id_used character varying(1),
id_used_date timestamp without time zone,
id_type character(200)
id 是表索引。
有人可以帮忙吗?
【问题讨论】:
-
使用 explain 关键字运行您的选择,您将看到它进行表扫描。因此,尽可能在使用聚合函数时应用适当的索引并使用 GROUP BY 子句。
-
您的表不能称为
table。$BODY $中的换行符也不能。而是发布您的实际功能。您发布的内容可能隐藏了问题。同样重要的是:如何准确地循环?
标签: postgresql function concurrency sql-update plpgsql