1

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

ALTER MATERIALIZED VIEW viewname TO VIEW
4

1 回答 1

3

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


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

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

方式一:使用指令

\d+ viewname

方式2:SELECT在内部表上做一个

SELECT definition FROM pg_matviews WHERE matviewname='viewname';

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

下一步是DROP物化视图,并简单地创建新视图:

DROP MATERIALIZED VIEW viewname;

最后一步是创建视图:

CREATE VIEW viewname AS <paste your SELECT statement here>

而且,瞧。手动方式完成

方法二:通过函数自动从matview变为view


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

CREATE TABLE mytable (id int, name varchar);
INSERT INTO mytable (1, 'John');
INSERT INTO mytable (2, 'Mary');

在 mytable 上方创建作为示例

CREATE MATERIALIZED VIEW mymatview1 AS SELECT * FROM mytable;

基于 mytable 创建了一个物化视图。

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

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

\d

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

查看转换为示例

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

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

于 2020-04-17T03:46:56.223 回答