重新定义物化视图,无需停机

时间:2013-08-06 16:45:16

标签: oracle materialized-views

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

有没有办法在本地或更优雅地执行此操作:

  1. 为物化视图创建公共同义词,并使使用该视图的所有内容都使用同义词。
  2. 使用新SQL创建新的物化视图
  3. 将同义词更改为指向新视图
  4. 删除旧视图。
  5. 我已经有动态执行此操作的代码,但它变得非常难看。似乎应该有更好的方法来解决这个问题。

1 个答案:

答案 0 :(得分: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不是droped - 只有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');