我在postgresql中有一张大表(超过十亿条记录)要处理。我需要遍历该表中的每个记录。因此,我使用光标。但是,游标从数据库中逐个读取记录,这很慢。
如果我每次都能从游标中获取20000条记录,则可以提高性能。因此,如何做到这一点。我已经写了一个伪代码打击,但是无法编译。
或者,还有另一种更好的方法来提高性能吗?
CREATE OR REPLACE FUNCTION sample.annovar_ods_sor_test(_sample_id integer)
RETURNS INTEGER
LANGUAGE plpgsql
AS $$
DECLARE
tmp RECORD;
ods_cursor CURSOR(my_sample_id INTEGER) FOR SELECT *
FROM sample.ods_annovar
WHERE sample_id = my_sample_id;
tmp_ods RECORD ARRAY;
BEGIN
OPEN ods_cursor(my_sample_id=_sample_id);
<<ods_loop>>
LOOP
FETCH RELATIVE 20000 FROM ods_cursor INTO tmp_ods;
IF tmp_ods = NULL THEN
EXIT ods_loop;
END IF;
FOR tmp IN tmp_ods LOOP
RAISE NOTICE '%', tmp."Start";
-- do something with the record
END LOOP;
END LOOP ;
CLOSE ods_cursor;
RETURN 1;
END
$$;
答案 0 :(得分:0)
使用FOR IN SELECT
语句-内部使用光标。无法更快地遍历查询结果。