Oracle 重新定义物化视图,无需停机
我有一个具体化的视图,需要为其重新定义SQL。我们有一个通过db链接点击视图的外部系统,monster视图需要5分钟来刷新视图中的数据。我知道如何为视图重新定义SQL的唯一方法是删除它并重新创建它,但是如果外部系统找不到表,或者它没有完整的数据集,这将非常糟糕。我需要尽可能少的停机时间 有没有比以下方式更自然或更优雅的方式来实现这一点:Oracle 重新定义物化视图,无需停机,oracle,materialized-views,Oracle,Materialized Views,我有一个具体化的视图,需要为其重新定义SQL。我们有一个通过db链接点击视图的外部系统,monster视图需要5分钟来刷新视图中的数据。我知道如何为视图重新定义SQL的唯一方法是删除它并重新创建它,但是如果外部系统找不到表,或者它没有完整的数据集,这将非常糟糕。我需要尽可能少的停机时间 有没有比以下方式更自然或更优雅的方式来实现这一点: 为物化视图创建公共同义词,并使所有使用该视图的对象都使用该同义词 使用新SQL创建新的物化视图 更改同义词以指向新视图 放弃旧的观点 我有代码来动态地完成这项工
我有代码来动态地完成这项工作,但它变得非常丑陋。似乎应该有更好的方法来处理这个问题。Oracle有一个内置的解决方案。请记住,mview声明与表声明是分开的 原始视图
create materialized view mv1 as select dept , count(*) as cnt from scott.emp;
我们希望更改声明,以便只计算超过5的部门
drop materialized view mv1 preserve table;
请注意PRESERVE TABLE
子句-表mv1没有被删除-只有MVView层
desc mv1
现在,我们在现有表的顶部创建具有不同查询的mview
create materialized view mv1 on prebuilt table as
select dept , count(*) as cnt from scott.emp where dept > 5;
请注意预构建表上的
子句。mview正在使用现有对象
exec dbms_mview.refresh_mview('mv1');
你想做什么样的重新定义?添加新列?更改数据类型?主要添加行。这是最常见的情况,通常涉及将UNION ALL添加到视图的定义中。视图包含一个访问级别列表,每个访问级别通常由它自己的查询定义。我们经常需要添加/删除/重新定义访问级别。如果元数据(例如,列数)必须更改,我们该如何做?有没有办法让旧MV的桌子保持活力,直到新MV完全建成?