6

我有一个物化视图,我需要为其重新定义 SQL。我们有一个外部系统通过 db 链接访问视图,而怪物视图需要 5 分钟来刷新视图中的数据。我知道如何为视图重新定义 SQL 的唯一方法是删除它并重新创建它,但如果外部系统找不到表,或者它没有完整的数据集,那将是非常糟糕的。我需要尽可能少的停机时间。

有什么方法可以本地或更优雅地做到这一点:

  1. 为物化视图创建公共同义词,并使使用该视图的所有内容都使用同义词。
  2. 使用新 SQL 创建新的物化视图
  3. 更改同义词以指向新视图
  4. 放弃旧观点。

我有代码可以动态地执行此操作,但它变得非常丑陋。似乎应该有更好的方法来处理这个问题。

4

1 回答 1

7

Oracle 有一个内置的解决方案。请记住,mview 声明与表的声明是分开的。

原来的mview

create materialized view mv1 as select dept , count(*) as cnt from scott.emp;

我们要更改声明,以便只计算超过 5 的部门

drop materialized view mv1 preserve table;

注意PRESERVE TABLE子句 - 表 mv1 没有被删除 - 只有 mview 层。

desc mv1

现在我们在现有表的顶部使用不同的查询创建 mview

create materialized view mv1 on prebuilt table as 
  select dept , count(*) as cnt from scott.emp where dept > 5;

注意on prebuilt table条款。mview 正在使用现有对象。

exec dbms_mview.refresh_mview('mv1');
于 2013-08-24T07:15:24.523 回答