修改物化视图查询

时间:2010-11-25 07:39:19

标签: sql oracle

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

5 个答案:

答案 0 :(得分:20)

不,您不能在不删除实例化视图的情况下更改它的查询。

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

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

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

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

答案 1 :(得分: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 ...

答案 2 :(得分:3)

您可以将mview留在原位。如果您关注的是在新mview实例化时最小化停机时间(因为您没有使用预构建的表),则可以执行以下操作。

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

    现在,无论何时需要重建,您都可以在几乎没有停机的情况下这样做,因为您可以简单地将视图指向新表/ mview。

答案 3 :(得分:2)

这可能是Oracle更高版本中的一项新功能,但是我发现它的工作原理很好:

DROP MATERIALIZED VIEW my_mview PRESERVE TABLE;

CREATE MATERIALIZED VIEW my_mview
ON PREBUILT TABLE ...

答案 4 :(得分:0)

可能能够利用现有的MV作为prebuilt table for the new MV的来源

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

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