Вашата функция работи много на празна работа.
Можете да опростите с FOR
цикъл с имплицитен курсор вместо по-досадния и скъп изричен курсор.
При по-внимателен поглед се оказва, че изобщо нямате нужда от нищо от това. Опростете радикално с проста заявка. Увих го в 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;
Би трябвало да е много по-бързо, докато връщате същото.
Използвайте и това:
WHERE u.entry_time >= now()::date - 1
AND u.entry_time < now()::date
вместо:
WHERE entry_time::date = now()::date - interval '1 day'
Алтернативата е sargable и може да използва обикновен индекс на entry_time
, което трябва да е от решаващо значение за производителността.