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

Oracle 重新定义物化视图,无需停机,oracle,materialized-views,Oracle,Materialized Views,我有一个具体化的视图,需要为其重新定义SQL。我们有一个通过db链接点击视图的外部系统,monster视图需要5分钟来刷新视图中的数据。我知道如何为视图重新定义SQL的唯一方法是删除它并重新创建它,但是如果外部系统找不到表,或者它没有完整的数据集,这将非常糟糕。我需要尽可能少的停机时间 有没有比以下方式更自然或更优雅的方式来实现这一点: 为物化视图创建公共同义词,并使所有使用该视图的对象都使用该同义词 使用新SQL创建新的物化视图 更改同义词以指向新视图 放弃旧的观点 我有代码来动态地完成这项工

我有一个具体化的视图,需要为其重新定义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完全建成?