Sua função está fazendo muito de trabalho vazio.
Você pode simplificar com um
FOR
loop com cursor implícito em vez do cursor explícito mais tedioso e caro.Em um olhar mais atento, verifica-se que você não precisa de nada disso. Simplifique radicalmente com uma simples consulta. Eu o envolvi em uma função SQL:
CREATE OR REPLACE FUNCTION ccdb.fn_email_details_auto()
RETURNS TABLE (code integer, area smallint, action smallint, flag smallint
, ucount integer, view_cnt integer) AS
$func$
SELECT u.section_code, u.ddu_area, u.ddu_action, u.status_flag
, u.ccdb_ucount, u.ccdb_view_cnt
FROM ccdb.update_qtable u
WHERE u.entry_time >= now()::date - 1
AND u.entry_time < now()::date -- sargable!
ORDER BY u.section_code, u.ddu_area, u.ddu_action;
$func$ LANGUAGE sql;
Deve ser muito mais rápido ao retornar o mesmo.
Além disso, use isto:
WHERE u.entry_time >= now()::date - 1
AND u.entry_time < now()::date
ao invés de:
WHERE entry_time::date = now()::date - interval '1 day'
A alternativa é sargável e pode usar um índice simples em
entry_time
, que deve ser crucial para o desempenho.