postgresql实体化视图在函数中永远刷新

gab6jxml  于 5个月前  发布在  PostgreSQL
关注(0)|答案(2)|浏览(95)

我想使用一个函数来按计划调用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分钟,并完成它。

hwamh0ep

hwamh0ep1#

检查你的系统是否过载,PostgreSQL是为在你的计算机之外运行而构建的,它被导入到你的命令行中。确保你检查了PostgreSQL日志并阅读了输出。像'iostat'这样的工具可以帮助你找出问题。也检查系统日志。

mf98qq94

mf98qq942#

我也遇到了同样的问题。只是刷新实体化视图本身(在函数外部)在10秒内工作,在函数内部他们从来没有完成过或者只是花了很多很多小时。有趣的是,时间甚至随着时间的推移而增加,我可以通过日志记录表看到。而且,就像你的情况一样,甚至通知也没有被执行。我有一个具有相同数据的staging系统,它工作得很好。
我可以通过更新相关的表来解决这个问题。然而,这并不能解释问题的原因,但它有助于解决问题。
这确实是一个奇怪的问题,我将感谢任何进一步的暗示的根本原因。

相关问题