我想使用一个函数来按计划调用everyday来实现多个视图。它看起来像这样:
CREATE OR REPLACE FUNCTION refresh_my_views()
RETURNS void
LANGUAGE plpgsql
AS $function$
DECLARE
-- Array of view names in the order they should be refreshed
views text[] := ARRAY[
'view1',
'view2',
'view3'
-- ... add more view names here as needed
];
view_name text;
start_time timestamp;
end_time timestamp;
BEGIN
-- Iterate over each view name in the array
FOREACH view_name IN ARRAY views LOOP
-- Log the start of the refresh operation
RAISE NOTICE 'Starting refresh of %', view_name;
-- Start the timer
start_time := current_timestamp;
-- Refresh the materialized view
EXECUTE format('REFRESH MATERIALIZED VIEW CONCURRENTLY %s', view_name);
-- Stop the timer
end_time := current_timestamp;
-- Log the completion of the refresh operation and the time taken
RAISE NOTICE 'Completed refresh of % (Time: %)',
view_name, age(end_time, start_time);
END LOOP;
END;
$function$;
字符串
但是这个函数运行时间超过了12个小时,似乎过了一段时间我不能通过它的PID事件pg_terminate_backend
,我不能运行另一个命令来并行刷新任何这些视图。视图创建速度很快,即使是最长的一个刷新也不应该超过15分钟。我也没有看到RAISE NOTICE
语句的消息。
它应该只是打印时间,最多需要大约30分钟,并完成它。
2条答案
按热度按时间hwamh0ep1#
检查你的系统是否过载,PostgreSQL是为在你的计算机之外运行而构建的,它被导入到你的命令行中。确保你检查了PostgreSQL日志并阅读了输出。像'iostat'这样的工具可以帮助你找出问题。也检查系统日志。
mf98qq942#
我也遇到了同样的问题。只是刷新实体化视图本身(在函数外部)在10秒内工作,在函数内部他们从来没有完成过或者只是花了很多很多小时。有趣的是,时间甚至随着时间的推移而增加,我可以通过日志记录表看到。而且,就像你的情况一样,甚至通知也没有被执行。我有一个具有相同数据的staging系统,它工作得很好。
我可以通过更新相关的表来解决这个问题。然而,这并不能解释问题的原因,但它有助于解决问题。
这确实是一个奇怪的问题,我将感谢任何进一步的暗示的根本原因。