Ihre Funktion leistet viel der leeren Arbeit.
Sie könnten mit einem FOR
vereinfachen Schleife mit implizitem Cursor anstelle des mühsameren und teureren expliziten Cursors.
Bei näherer Betrachtung stellt sich heraus, dass Sie das alles gar nicht brauchen. Radikal vereinfachen mit einer einfachen Abfrage. Ich habe es in eine SQL-Funktion gepackt:
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;
Sollte viel sein schneller, während das Gleiche zurückgegeben wird.
Verwenden Sie auch Folgendes:
WHERE u.entry_time >= now()::date - 1
AND u.entry_time < now()::date
statt:
WHERE entry_time::date = now()::date - interval '1 day'
Die Alternative ist sargable und kann einen einfachen Index für entry_time
verwenden , was entscheidend für die Leistung sein sollte.