Su función está haciendo mucho de trabajo vacío.
Podrías simplificar con un FOR
bucle con cursor implícito en lugar del cursor explícito más tedioso y costoso.
En una mirada más cercana, resulta que no necesita nada de esto en absoluto. Simplificar radicalmente con una simple consulta. Lo envolví en una función 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;
Debería ser mucho más rápido mientras devuelve lo mismo.
Además, use esto:
WHERE u.entry_time >= now()::date - 1
AND u.entry_time < now()::date
en lugar de:
WHERE entry_time::date = now()::date - interval '1 day'
La alternativa es sargable y puede usar un índice simple en entry_time
, que debería ser crucial para el rendimiento.