将物化视图更改为常规视图

vou*_*rus 2 postgresql materialized-views sql-view

出于性能原因,我的数据库中有一个物化视图。环境的约束已经改变,现在我需要使更新出现得更快,视图本身的性能不再那么重要。如何将物化视图更改为常规视图?寻找类似的东西:

ALTER MATERIALIZED VIEW viewname TO VIEW
Run Code Online (Sandbox Code Playgroud)

Wil*_*pes 5

方法一:手动复制/粘贴法

\n
\n

由于物化视图和视图是数据库中的不同对象,因此您需要删除物化视图并根据您的物化视图创建视图。

\n

您可以SELECT通过两种方式显示物化视图中的语句:

\n

方式一:使用指令

\n
\\d+ viewname\n
Run Code Online (Sandbox Code Playgroud)\n

方法 2:SELECT在内表上执行操作

\n
SELECT definition FROM pg_matviews WHERE matviewname=\'viewname\';\n
Run Code Online (Sandbox Code Playgroud)\n

上面列出的两个命令都将显示SELECT在物化视图上使用的命令,因此您可以在文本编辑器中复制以进行粘贴。

\n

下一步是DROP物化视图并创建新的,如下所示:

\n
DROP MATERIALIZED VIEW viewname;\n
Run Code Online (Sandbox Code Playgroud)\n

最后一步是创建视图:

\n
CREATE VIEW viewname AS <paste your SELECT statement here>\n
Run Code Online (Sandbox Code Playgroud)\n

并且,瞧\xc3\xa1。手动方式完成

\n

方式二:通过函数自动从matview转为view

\n
\n

如果您无法进行复制/粘贴,我们可以使用的另一个选项是创建一个函数来转换数据。如下:

\n
CREATE TABLE mytable (id int, name varchar);\nINSERT INTO mytable (1, \'John\');\nINSERT INTO mytable (2, \'Mary\');\n
Run Code Online (Sandbox Code Playgroud)\n

以上面创建的 mytable 为例

\n
CREATE MATERIALIZED VIEW mymatview1 AS SELECT * FROM mytable;\n
Run Code Online (Sandbox Code Playgroud)\n

基于mytable创建物化视图。

\n
CREATE OR REPLACE FUNCTION frommaviewttoview(VARCHAR) \nRETURNS VOID as $$\n    DECLARE\n      mymatview ALIAS FOR $1; \n      tomatview VARCHAR;\n    BEGIN\n        SELECT definition INTO tomatview\n          FROM pg_matviews\n         WHERE matviewname=$1;\n       EXECUTE \'DROP MATERIALIZED VIEW \'||mymatview;\n       EXECUTE \'CREATE VIEW \'||mymatview||\' AS \'||tomatview;\n    END;\n$$ LANGUAGE plpgsql;\n
Run Code Online (Sandbox Code Playgroud)\n

创建了一个将物化视图转换为视图的函数

\n
\\d\n
Run Code Online (Sandbox Code Playgroud)\n

并且,\\d我们可以看到从我的测试中提取的物化视图信息,如下图所示。

\n

查看转换后的示例

\n

该函数获取定义并执行DROP MATERIALIZED VIEW原始CREATE MATERIALIZED VIEW物化SELECT视图的定义。

\n

因此,如果您有索引物化视图,则需要采取更多控制,因此,如果有任何引用块,您的物化视图可能不会被排除,并且需要执行额外的控制。

\n