修改物化视图查询

cod*_*990 23 sql oracle

我需要修改Materialized视图查询.可以在不丢弃和重新创建的情况下执行相同操作.

小智 20

不,您不能在不丢弃物化视图的情况下更改物化视图的查询.

CREATE MATERIALIZED VIEW语法不支持该功能.

ALTER MATERIALIZED VIEW用于通过以下一种或多种方式修改现有的物化视图:

  • 改变其存储特性
  • 更改其刷新方法,模式或时间
  • 改变它的结构,使它成为一种不同类型的物化视图
  • 启用或禁用查询重写

请参阅Oracle 12c第1版手册:


erb*_*ock 5

您可以将 mview 保留在原处。如果您关心的是在新的 mview 实例化时最大限度地减少停机时间(因为您没有使用预构建的表),您可以执行以下操作。

  1. 在预建表上创建一个名为 mview_1 的新表
  2. 创建后,您可以删除旧的
  3. 创建或替换视图 mview 作为 select * from mview_1

现在,每当您需要重建时,您都可以在几乎没有停机时间的情况下完成此操作,因为您可以简单地将视图指向未来的新表/mview。


Max*_*axH 5

对于你不确定MVIEW是否存在的情况(这是CREATE OR REPLACE真正有用的),我使用;

BEGIN
    EXECUTE IMMEDIATE 'DROP MATERIALIZED VIEW name_of_mview';
    EXCEPTION
        WHEN OTHERS THEN
            IF SQLCODE = -12003 THEN
                dbms_output.put_line('MVIEW does not exist, which was somewhat expected');
            ELSE
                RAISE;
            END IF;
END;
/

CREATE MATERIALIZED VIEW name_of_mview ... AS SELECT ...
Run Code Online (Sandbox Code Playgroud)


Gar*_*ers 0

也许能够利用现有的 MV 作为新 MV 的预建表的源

当然,很大程度上取决于您对查询所做的操作。例如,如果您要添加一列,则需要刷新所有内容才能获取其新值。

附言。将现有 MV 转换为表的快速方法是分区交换,但要注意陷阱。然后,您操作该表以匹配新的结果集,并根据操作的表创建新的 MV。