Din funktion gør meget af tomt arbejde.
Du kan forenkle med en FOR
sløjfe med implicit markør i stedet for den mere kedelige og dyre eksplicitte markør.
Når man ser nærmere på det, viser det sig, at du slet ikke har brug for noget af dette. Forenkle radikalt med en simpel forespørgsel. Jeg pakkede det ind 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 være meget hurtigere, mens du returnerer det samme.
Brug også denne:
WHERE u.entry_time >= now()::date - 1
AND u.entry_time < now()::date
i stedet for:
WHERE entry_time::date = now()::date - interval '1 day'
Alternativet er sargerbart og kan bruge et almindeligt indeks på entry_time
, hvilket burde være afgørende for ydeevnen.