刷新数据仓库中物化视图的策略

Woo*_*Moo 5 sql oracle performance plsql data-warehouse

我有一个系统,其物化视图包含大约10亿个项目,在一个两小时的基础上,我需要更新大约2亿个(20%的记录).我的问题是我的物化视图上的刷新策略应该是什么?截至目前,它是一个间隔刷新.我很好奇刷新间隔副刷新之间的性能影响,并重新命名/替换旧的物化视图与新的物化视图.潜在的问题是Oracle使用的索引,它创建了大量的重做.任何建议表示赞赏.

更新
由于有些人似乎认为这不是主题,我当前的观点是执行以下操作:

创建一个Oracle调度链,调用一系列PL/SQL(编程语言I promise)函数,以伪并行方式刷新实体化视图.然而,就好像我落入了DBA的位置,我希望用算法和/或一些代码来解决数据问题.

Woo*_*Moo 2

好的,这是我想出的解决方案,您的里程可能会有所不同,事后我们将不胜感激任何反馈。总体策略是执行以下操作:

1) 利用 Oracle Scheduler 并行执行链(作业)
2) 利用视图(常规类型)作为从应用程序到数据库的接口
3) 依靠按以下方式构建的物化视图

 create materialized view foo  
    parallel  
    nologging  
    never refresh  
    as  
    select statement
Run Code Online (Sandbox Code Playgroud)

根据需要使用以下内容:

   create index baz on foo(bar) nologging
Run Code Online (Sandbox Code Playgroud)

这样做的优点是,我们可以在删除+重新创建视图之前在后台构建物化视图,如步骤 2 中所述。现在的优点是创建动态命名的物化视图,同时保持视图具有相同的名称。关键是在新的物化视图完成之前不要破坏原始的物化视图。这也允许快速删除,因为需要关心的重做最少。这使得能够在 5 分钟内创建约 10 亿条记录的物化视图,满足了我们每 30 分钟“刷新”一次的要求。此外,这可以在单个数据库节点上处理,因此即使硬件有限,也是可能的。

下面是一个 PL/SQL 函数,可以为您创建它:

CREATE OR REPLACE procedure foo_bar as
foo_view varchar2(500) := 'foo_'|| to_char(sysdate,'dd_MON_yyyy_hh_mi_ss');
BEGIN
 execute immediate
 'Create materialized view '||  foo_view || '
  parallel
  nologging
  never refresh
  as
  select * from cats';
END foo_bar;
Run Code Online (Sandbox Code Playgroud)