我需要修改Materialized视图查询。可以在不丢弃和重新创建的情况下执行相同操作。
答案 0 :(得分:20)
不,您不能在不删除实例化视图的情况下更改它的查询。
CREATE MATERIALIZED VIEW语法不支持该功能。
ALTER MATERIALIZED VIEW用于通过以下一种或多种方式修改现有的物化视图:
请参阅Oracle 12c第1版手册:
CREATE MATERIALIZED VIEW语法: http://docs.oracle.com/cd/E16655_01/server.121/e17209/statements_6002.htm#i2145767
ALTER MATERIALIZED VIEW语法: http://docs.oracle.com/cd/E16655_01/server.121/e17209/statements_2002.htm#SQLRF00808
答案 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实例化时最小化停机时间(因为您没有使用预构建的表),则可以执行以下操作。
现在,无论何时需要重建,您都可以在几乎没有停机的情况下这样做,因为您可以简单地将视图指向新表/ 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。