根据文档:
CONCURRENTLY 刷新物化视图而不锁定物化视图上的并发选择。(……)
... 其他内容 ...
即使使用此选项,一次也只能针对任何 一个物化视图运行一个 REFRESH。
我有一个函数可以检查 MATERIALIZED VIEW 的上次刷新时间,如果超过 60 秒,它会刷新它。
但是,如果我尝试同时从两个单独的进程刷新物化视图会发生什么?他们会排队还是会引发错误?
有没有办法检测何时刷新 MATERIALIZED VIEW 从而避免触摸它?
目前,我已经在刷新(设置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;
Run Code Online (Sandbox Code Playgroud)
然后,每当我调用此过程时,我都会检查最新的last_update
及其refreshing
值。如果refreshing
为 true,则不要尝试刷新物化视图。
EXECUTE 'SELECT
extract(epoch FROM now() - (last_update))::integer,
refreshing
FROM refresh_status
ORDER BY …
Run Code Online (Sandbox Code Playgroud) 我正在管理一个包含几百万条记录的表,这些记录被实时插入。我的应用程序的一部分需要显示最后插入的 N 行,所以一开始我只是查询:
select id, logdate, content from measurements order by logdate DESC limit 500;
Run Code Online (Sandbox Code Playgroud)
几天后,我发现设置id
为(对于此示例)更快10000000000 - extract(epoch from logdate)
,并将其用作PRIMARY KEY
,所以
select id, date, content from measurements limit 500;
Run Code Online (Sandbox Code Playgroud)
自然会按 排序id
,因此会产生最新的记录。
随着表的增长,它变得难以管理,所以我求助于分区。我按照文档说的那样做了:
CREATE TABLE measurement_y2007m11 (
CHECK ( logdate >= DATE '2007-11-01' AND logdate < DATE '2007-12-01' )
) INHERITS (measurement);
CREATE TABLE measurement_y2007m12 (
CHECK ( logdate >= DATE '2007-12-01' AND logdate < DATE '2008-01-01' )
) INHERITS (measurement); …
Run Code Online (Sandbox Code Playgroud)