【问题标题】:Change materialized view to regular view将物化视图更改为常规视图
【发布时间】:2020-04-19 01:48:59
【问题描述】:

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

ALTER MATERIALIZED VIEW viewname TO VIEW

【问题讨论】:

    标签: postgresql sql-view materialized-views


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

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

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

    【讨论】:

    • 谢谢。理想情况下,我正在寻找一种免提方式来执行此操作,因为我目前正在管理 AWS/postgres/k8s/backend config/cicd/ids/edge/ 和远程客户端网络,并且不可能进行上下文切换。所以我需要通过尽可能多的自动化和尽可能少的复制粘贴来帮助自己。我想我可以弄清楚如何使用您分享的内容来做到这一点,但是如果我尝试这样做,您是否发现有什么可以赶上我的?
    • @voutasaurus。我改进了我的答案,以更自动化的方式使用 plpgsql 函数。在 Postgresql 11 上工作。希望对您有所帮助。
    猜你喜欢
    • 2013-03-01
    • 2018-01-08
    • 2020-11-14
    • 2015-06-29
    • 2019-10-07
    • 2014-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多