替换 Postgres 中的物化视图

Joh*_*ohn 29 postgresql view materialized-view

我有一个物化视图Postgres 9.3,我想用新列进行更新。但是,其他物化视图也依赖于该视图,并且错误消息表明当其他对象依赖于该视图时,无法删除该视图。

错误:无法删除物化视图 latest_charges 因为其他对象依赖它

从文档中还可以看出 REPLACE 关键字对物化视图无效。除了删除所有依赖对象并重建每个对象之外,还有其他捷径吗?

alf*_*onx 21

从 PostgreSQL 9.4 开始:与CREATE VIEW的文档不同,CREATE MATERIALIZED VIEW的文档没有提到 REPLACE 关键字。除了删除所有依赖对象并重建每个对象之外,似乎没有捷径可走。

当你这样做时,我只能推荐两件小事:

  1. 使用 DROP MATERIALIZED VIEW blabla CASCADE 获取所有依赖对象的列表
  2. 在一个事务中删除和重新创建所有依赖对象。


Rui*_*iDC 7

对于我的情况,我更喜欢使用视图层来限制下降:

  1. 创建后缀为“_new”的物化视图的副本,并使用“WITH NO DATA”来提高性能,确保所有索引也使用后缀和通过 DROP...CASCADE 发现的任何其他依赖对象创建
  2. 在新的物化视图上创建一个视图来提供抽象层,所以我只需要在一个地方更改它
  3. ALTER 现有依赖项改为引用新视图(如果需要,事先刷新数据)
  4. 删除现在不应该有任何依赖项的原始物化视图和索引
  5. ALTER THE 物化视图和索引删除后缀以恢复原始名称

例如。

create table test (myfield int);
insert into test values (1);
create materialized view mv_test as select myfield from test;
create view v_test as select myfield from mv_test;
select * from v_test;
create materialized view mv_test_new as select myfield, myfield+1 as myfield2 from test;
alter view v_test rename to v_test_old;
alter materialized view mv_test rename to mv_test_old;
create view v_test as select myfield,myfield2 from mv_test_new;
select * from v_test;
alter materialized view mv_test_new rename to mv_test;
drop view v_test_old; -- when ready
drop materialized view mv_test_old; -- when ready
Run Code Online (Sandbox Code Playgroud)