Din funktion gör mycket av tomt arbete.
Du kan förenkla med en FOR
loop med implicit markör istället för den mer tråkiga och dyra explicita markören.
Vid en närmare titt visar det sig att du inte behöver något av detta alls. Förenkla radikalt med en enkel fråga. Jag slog in den i en SQL-funktion:
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;
Bör vara mycket snabbare samtidigt som du returnerar densamma.
Använd även detta:
WHERE u.entry_time >= now()::date - 1
AND u.entry_time < now()::date
istället för:
WHERE entry_time::date = now()::date - interval '1 day'
Alternativet är sargable och kan använda ett vanligt index på entry_time
, vilket borde vara avgörande för prestanda.