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

时间:2012-10-20 18:19:24

标签: sql performance oracle plsql data-warehouse

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

更新
由于有些人似乎认为这不是主题,我目前的观点是要做到以下几点:

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

1 个答案:

答案 0 :(得分:2)

好的,所以这里是我提出的解决方案,您的里程可能会有所不同,任何反馈都会在事后得到赞赏。总体战略是做以下事情:

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

 create materialized view foo  
    parallel  
    nologging  
    never refresh  
    as  
    select statement

根据需要使用以下内容:

   create index baz on foo(bar) nologging

这样做的好处是我们可以在删除+重新创建视图之前在后台构建物化视图,如步骤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;