Je functie doet veel leeg werk.
Je zou kunnen vereenvoudigen met een FOR
loop met impliciete cursor in plaats van de meer vervelende en dure expliciete cursor.
Bij nader inzien blijkt dat je dit helemaal niet nodig hebt. radicaal vereenvoudigen met een simpele vraag. Ik heb het verpakt in een SQL-functie:
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;
Moet veel zijn sneller terwijl u hetzelfde retourneert.
Gebruik ook dit:
WHERE u.entry_time >= now()::date - 1
AND u.entry_time < now()::date
in plaats van:
WHERE entry_time::date = now()::date - interval '1 day'
Het alternatief is sargable en kan een gewone index gebruiken op entry_time
, wat cruciaal zou moeten zijn voor de prestaties.