gpt4 book ai didi

postgresql - 如何从 PL/pgSQL 中的子选择一次更新多条记录

转载 作者:行者123 更新时间:2023-11-29 14:01:05 25 4
gpt4 key购买 nike

我有一个存储过程,它可以工作但速度非常慢。

基本上我想做的是更新我在单个更新命令中从子查询获得的一组行。另一个警告是我想返回我在语句中更新的行。

现在我正在使用一个循环来获取一行并更新它,使用 return into 存储结果,这有效但非常慢。

建议?

这是当前工作版本以及模式创建语句。

CREATE TABLE "queued_message"
(
id bigserial NOT NULL,
body json NOT NULL,
status character varying(50) NOT NULL,
queue character varying(150) NOT NULL,
last_modified timestamp without time zone NOT NULL,
CONSTRAINT id_pkey PRIMARY KEY (id)
);

CREATE TYPE returned_message as (id bigint, body json, status character varying(50) , queue character varying(150), last_modified timestamp without time zone);

CREATE OR REPLACE FUNCTION get_next_notification_message_batch(desiredQueue character varying(150), numberOfItems integer)
RETURNS SETOF returned_message AS $$
DECLARE result returned_message; messageCount integer := 1;
BEGIN
lock table queued_notification_message in exclusive mode;
LOOP
update queued_notification_message
set
status='IN_PROGRESS', last_modified=now()
where
id in (
select
id
from
queued_notification_message
where
status='SUBMITTED' and queue=desiredQueue
limit 1
)
returning * into result;
RETURN NEXT result;
messageCount := messageCount+1;
EXIT WHEN messageCount > numberOfItems;
END LOOP;
END;$$LANGUAGE plpgsql;

最佳答案

很难加速代码,由于不支持 UPDATE 语句的 LIMIT 子句,这将是相同的,也许下面的例子就足够了:

CREATE OR REPLACE FUNCTION public.fx2(n integer) RETURNS SETOF oo LANGUAGE plpgsqlAS $function$begin  return query update oo set a = b                  where b in (select b                                 from oo                               order by b                                limit n)                  returning *;  return;end;$function$postgres=# insert into oo select 1, i from generate_series(1,100) g(i);INSERT 0 100postgres=# select * from fx2(1); a | b ---+--- 1 | 1(1 row)postgres=# select * from fx2(4); a | b ---+--- 1 | 1 2 | 2 3 | 3 4 | 4(4 rows)postgres=# select * from oo limit 10; a | b  ---+---- 1 |  5 1 |  6 1 |  7 1 |  8 1 |  9 1 | 10 1 | 11 1 | 12 1 | 13 1 | 14(10 rows)

关于postgresql - 如何从 PL/pgSQL 中的子选择一次更新多条记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17416825/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com