我是PostgreSQL的新手。假设我有一个包含数千条记录的表(tbl_box)并且它正在增长,我想从特定索引中删除10行(例如我想从第50行到第59行删除10条记录)我写了一个函数
您可以在下面看到:
- Function: public.signalreject()
-- DROP FUNCTION public.signalreject();
CREATE OR REPLACE FUNCTION public.signalreject()
RETURNS void AS
$BODY$
DECLARE
rec RECORD;
cur CURSOR
FOR SELECT barcode,id
FROM tbl_box where gf is null order by id desc;
counter int ;
BEGIN
-- Open the cursor
OPEN cur;
counter:=0;
LOOP
-- fetch row into the rec
FETCH cur INTO rec;
-- exit when no more row to fetch
EXIT WHEN NOT FOUND;
counter :=counter+1;
-- build the output
IF counter >= 50 and counter < 60 THEN
delete from tbl_box where barcode = rec.barcode;
END IF;
END LOOP;
-- Close the cursor
CLOSE cur;
END; $BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION public.signalreject()
OWNER TO Morteza;
我发现游标占用内存并且CPU使用率很高。除了光标你还有什么建议我吗? 这是一个很好的方法吗?
我需要最快的方法,因为在最短的时间内删除对我很重要。
答案 0 :(得分:2)
这看起来很精致,为什么不做呢
delete from tbl_box
where barcode in
( select barcode
from tbl_box
where gf is null
order by id desc limit 10 offset 49
);
假设barcode
是唯一的。我们跳过49行开始从第50行删除10行。