我还没有找到一个优雅的解决方案,所以我想知道是否有人偶然发现了类似的东西。
在Postgres中,MyViewA
使用了MyViewB
使用的MyViewC
视图。作为性能改进,我想实现视图A,但是我找不到一种简单的方法来做到这一点,而不会删除和重新定义整个依赖序列。
那就是,理想情况下,我想这样做:
REPLACE MATERIALIZED VIEW MyViewA AS SELECT...
但遗憾的是,Postgres不允许在同一上下文中使用REPLACE
和MATERIALIZED
。我只尝试了DROP VIEW
然后CREATE MATERIALIZED VIEW
,但这当然会导致Postgres抱怨cannot drop view MyViewA because other objects depend on it
有什么建议吗?
答案 0 :(得分:1)
执行此操作的一种方法是创建临时视图,修改MyViewB
以使用该视图,重新定义原始视图并将MyViewB
修改回原始视图,或者如果没有查询{{} 1}},只需重命名,定义一个新的并更改MyViewA
。
因此假设原文是(非常简化):
MyViewB
然后您可以像这样修改CREATE VIEW MyViewA AS SELECT col1, col2, col3 FROM table;
CREATE VIEW MyViewB AS SELECT col1, col2 FROM MyViewA where col3=1;
CREATE VIEW MyViewC AS SELECT col1 FROM MyViewC where col2='test';
:
MyViewA
这样您就不需要处理任何相关视图。