如何加快在plpgsql中获取游标的速度?

时间:2018-11-04 14:17:28

标签: postgresql plpgsql

我在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
$$;

1 个答案:

答案 0 :(得分:0)

使用FOR IN SELECT语句-内部使用光标。无法更快地遍历查询结果。