La tua funzione sta facendo molto di lavoro vuoto.
Potresti semplificare con un FOR
ciclo con cursore implicito invece del più noioso e costoso cursore esplicito.
A un'occhiata più da vicino risulta che non hai bisogno di nulla di tutto ciò. Semplificare radicalmente con una semplice domanda. L'ho avvolto in una funzione 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;
Dovrebbe essere molto più veloce restituendo lo stesso.
Inoltre, usa questo:
WHERE u.entry_time >= now()::date - 1
AND u.entry_time < now()::date
invece di:
WHERE entry_time::date = now()::date - interval '1 day'
L'alternativa è sargable e può utilizzare un semplice indice su entry_time
, che dovrebbe essere fondamentale per le prestazioni.