Votre fonction fait beaucoup de travail vide.
Vous pouvez simplifier avec un FOR
boucle avec un curseur implicite au lieu du curseur explicite plus fastidieux et coûteux.
En y regardant de plus près, il s'avère que vous n'avez besoin de rien de tout cela. Simplifier radicalement avec une simple requête. Je l'ai enveloppé dans une fonction 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;
Ça devrait être beaucoup plus rapide tout en retournant le même.
Utilisez également ceci :
WHERE u.entry_time >= now()::date - 1
AND u.entry_time < now()::date
au lieu de :
WHERE entry_time::date = now()::date - interval '1 day'
L'alternative est sargable et peut utiliser un index simple sur entry_time
, ce qui devrait être crucial pour les performances.