Postgres 刷新物化视图锁

sup*_*pyo 7 postgresql materialized-view

我在 Postgres 中有一个物化视图,想知道刷新该视图时取出了哪些锁(如果有)。

CREATE TABLE people ( name VARCHAR(30) );
INSERT INTO people VALUES ('Alice'), ('Bob'), ('Cher');
CREATE MATERIALIZED VIEW test AS SELECT * FROM people;
REFRESH MATERIALIZED VIEW test;
Run Code Online (Sandbox Code Playgroud)

具体来说,我试图了解该REFRESH MATERIALIZED VIEW命令是否取出ACCESS EXCLUSIVE锁。

我尝试了一个解释但没有成功:

#> EXPLAIN REFRESH MATERIALIZED VIEW test;

                QUERY PLAN                 
-------------------------------------------
Utility statements have no plan structure
Run Code Online (Sandbox Code Playgroud)

Cra*_*ger 10

REFRESH MATERIALIZED VIEW CONCURRENTLY需要一个EXCLUSIVE锁,所以SELECTs 可能仍然运行。根据手册

似乎有一个疏忽REFRESH MATERIALIZED VIEW(没有CONCURRENTLY),因为它没有在那里列出。对源代码的搜索显示,如您所料,ExecRefreshMatView需要ACCESS EXCLUSIVE锁定,因此不会在视图上运行其他查询。

我已经提交了一个文档补丁来列出它。

  • 旁注 - `CONCURRENTLY` 功能在 Postgres 9.4 之前不可用。 (2认同)