根据文档:
同步刷新实例化视图,而不会锁定实例化视图上的并发选择。(...)
...其他内容...
即使使用此选项,一次也只能针对任何 一个实例化视图运行一次REFRESH。
我有一个功能,可以检查上次刷新时间以进行材料视图,如果超过60秒,它将刷新它。
但是,如果我尝试同时从两个单独的进程中刷新实例化视图,将会发生什么?他们会排队还是会引发错误?
有没有一种方法可以检测何时刷新了材料视图,因此避免触摸它?
目前,我在刷新之前将表记录填充(设置refreshing
为true
),然后false
在过程完成时将其设置为。
EXECUTE 'INSERT INTO refresh_status (last_update, refreshing)
VALUES (clock_timestamp(), true) RETURNING id') INTO refresh_id;
EXECUTE 'REFRESH MATERIALIZED VIEW CONCURRENTLY my_mat_view';
EXECUTE 'UPDATE refresh_status SET refreshing=false WHERE id=$1' USING refresh_id;
然后,每当我调用此过程时,我都会检查最新过程last_update
及其refreshing
值。如果refreshing
为true,则不要尝试刷新实例化视图。
EXECUTE 'SELECT
extract(epoch FROM now() - (last_update))::integer,
refreshing
FROM refresh_status
ORDER BY last_update DESC
LIMIT 1' INTO update_seconds_ago, refreshing;
IF(updated_seconds_ago > 60 AND refreshing = FALSE) THEN
-- the refresh block above
END IF;
但是,我不确定刷新标志是否正在同步更新(我的意思是,它实际上在等待刷新实际完成)
这种方法合理吗?还是我在这里遗漏了一些东西?