小编fff*_*abs的帖子

如果两个进程同时尝试刷新实体化视图会发生什么?

根据文档:

CONCURRENTLY 刷新物化视图而不锁定物化视图上的并发选择。(……)

... 其他内容 ...

即使使用此选项,一次也只能针对任何 一个物化视图运行一个 REFRESH

一个函数可以检查 MATERIALIZED VIEW 的上次刷新时间,如果超过 60 秒,它会刷新它。

但是,如果我尝试同时从两个单独的进程刷新物化视图会发生什么?他们会排队还是会引发错误?

有没有办法检测何时刷新 MATERIALIZED VIEW 从​​而避免触摸它?

目前,我已经在刷新(设置refreshingtrue)之前填充表记录,然后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)

postgresql materialized-view plpgsql

15
推荐指数
2
解决办法
8064
查看次数

约束排除以获取最新的 N 行

我正在管理一个包含几百万条记录的表,这些记录被实时插入。我的应用程序的一部分需要显示最后插入的 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)

postgresql index partitioning

0
推荐指数
1
解决办法
243
查看次数