Как ускорить скорость выборки курсора в plpgsql? - PullRequest
0 голосов
/ 04 ноября 2018

У меня есть большая таблица (более миллиарда записей) в 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 голосов
/ 04 ноября 2018

Использовать оператор FOR IN SELECT - он использует курсор внутри. Не возможно перебрать результат запроса быстрее.

...