Fungsi Anda melakukan banyak pekerjaan kosong.
Anda dapat menyederhanakan dengan FOR
loop dengan kursor implisit alih-alih kursor eksplisit yang lebih membosankan dan mahal.
Jika dilihat lebih dekat, ternyata Anda tidak memerlukan semua ini sama sekali. Sederhanakan secara radikal dengan pertanyaan sederhana. Saya membungkusnya menjadi fungsi 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;
Seharusnya banyak lebih cepat saat mengembalikan yang sama.
Juga, gunakan ini:
WHERE u.entry_time >= now()::date - 1
AND u.entry_time < now()::date
bukannya:
WHERE entry_time::date = now()::date - interval '1 day'
Alternatifnya adalah sargable dan dapat menggunakan indeks biasa pada entry_time
, yang seharusnya sangat penting untuk performa.