将实体化视图更改为常规视图

问题描述 投票:1回答:1

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

ALTER MATERIALIZED VIEW viewname TO VIEW
postgresql sql-view materialized-views
1个回答
3
投票

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


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

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

方式1:使用指令

\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>

而且,瞧。完成手动方式

方法2:通过功能自动从matview切换到视图


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

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,我们可以看到从我的测试中提取的物化视图信息,如下图所示。

View converted as example

此函数获取定义,并使用原始实例化视图的DROP MATERIALIZED VIEW定义执行CREATE MATERIALIZED VIEWSELECT

因此,如果您已为物化视图建立索引,则需要进行更多控制,因此,如果有任何参考块,则您的物化视图可能不会被排除,并且需要进行额外的控制。

© www.soinside.com 2019 - 2024. All rights reserved.