我还没有找到一个优雅的解决方案,所以我想知道是否有其他人偶然发现了类似的东西。
在 Postgres 中,我有一个 View MyViewA
由 MyViewB
使用,而 MyViewC
使用。作为性能改进,我想具体化 View A,但我无法找到一种简单的方法来执行此操作而不删除并重新定义整个依赖项序列。
也就是说,理想情况下,我想这样做:
REPLACE MATERIALIZED VIEW MyViewA AS SELECT...
但不幸的是,Postgres 不允许在同一上下文中使用 REPLACE
和 MATERIALIZED
。我尝试了 DROP VIEW
然后 CREATE MATERIALIZED VIEW
,但这当然会导致 Postgres 提示它不能删除 View MyViewA 因为其他对象依赖于它
有什么建议吗?
最佳答案
一种方法是创建一个临时 View ,修改 MyViewB
以使用它,重新定义原始 View 并将 MyViewB
修改回原始 View ,或者如果有不查询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 MyViewB where col2='test';
然后你可以像这样修改MyViewA
:
ALTER VIEW MyViewA RENAME TO MyViewTmp;
CREATE OR REPLACE VIEW MyViewB AS SELECT col1, col2 FROM MyViewTmp where col3=1;
CREATE MATERIALIZED VIEW MyViewA AS SELECT col1, col2, col3 FROM table;
CREATE OR REPLACE VIEW MyViewB AS SELECT col1, col2 FROM MyViewA where col3=1;
DROP VIEW MyViewTmp;
这样您就不需要处理任何依赖 View 。
关于sql - Postgres : Replace a view that has dependencies,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30335407/