【发布时间】:2011-05-15 13:14:41
【问题描述】:
我需要修改物化视图查询。可以在不删除和重新创建它的情况下做同样的事情。
【问题讨论】:
我需要修改物化视图查询。可以在不删除和重新创建它的情况下做同样的事情。
【问题讨论】:
不,您不能在不删除实体化视图的情况下更改它的查询。
CREATE MATERIALIZED VIEW 语法不支持该功能。
ALTER MATERIALIZED VIEW 用于通过以下一种或多种方式修改现有物化视图:
请参阅 Oracle 12c 第 1 版手册以了解:
【讨论】:
对于您不确定 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 ...
【讨论】:
您可以将 mview 留在原处。如果您关心的是在新 mview 实例化时尽量减少停机时间(因为您没有使用预建表),您可以执行以下操作。
现在,每当您需要重建时,您都可以在几乎没有停机时间的情况下进行重建,因为您可以简单地将视图指向新的表/mview。
【讨论】:
这可能是更高版本的 Oracle 中的一个新功能,但我发现这很好用:
DROP MATERIALIZED VIEW my_mview PRESERVE TABLE;
CREATE MATERIALIZED VIEW my_mview
ON PREBUILT TABLE ...
【讨论】:
您可能可以利用现有的MV作为prebuilt table for the new MV的来源
当然,很大程度上取决于您对查询所做的事情。例如,如果您要添加一列,则需要刷新所有内容以获取其新值。
附言。将现有 MV 转换为表的快速方法是分区交换,但要注意gotchas。然后您操作该表以匹配新的结果集并基于操作的表创建新的 MV。
【讨论】: