Chức năng của bạn đang hoạt động rất nhiều trong tổng số công việc trống.
Bạn có thể đơn giản hóa bằng FOR
lặp lại với con trỏ ngầm thay vì con trỏ rõ ràng tẻ nhạt và tốn kém hơn.
Khi xem xét kỹ hơn, hóa ra bạn không cần bất kỳ điều này. Đơn giản hóa triệt để với một truy vấn đơn giản. Tôi đã gói nó thành một hàm 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;
Nên nhiều nhanh hơn trong khi trả về như cũ.
Ngoài ra, hãy sử dụng cái này:
WHERE u.entry_time >= now()::date - 1
AND u.entry_time < now()::date
thay vì:
WHERE entry_time::date = now()::date - interval '1 day'
Giải pháp thay thế có thể phân loại và có thể sử dụng một chỉ mục thuần túy trên entry_time
, điều này sẽ rất quan trọng đối với hiệu suất.