【问题标题】:Refresh strategy for materialized views in a data warehouse数据仓库中物化视图的刷新策略
【发布时间】:2012-10-11 01:51:12
【问题描述】:

我有一个系统,它的物化视图包含大约 10 亿个项目,在一致的两小时内,我需要更新大约 2 亿个(占记录的 20%)。我的问题是我的物化视图的刷新策略应该是什么?截至目前,它是间隔刷新的。我很好奇在间隔刷新和从不刷新和用新的物化视图重命名/替换旧物化视图之间的性能影响。根本问题是甲骨文使用的索引会产生大量的重做。任何建议表示赞赏。

更新
由于有些人似乎认为这是题外话,我目前的观点是做以下事情:

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

【问题讨论】:

  • 关闭主题的问题是 dba.se 在回答您的问题方面基本上没有用。
  • 但这不是编程问题。
  • 另外,是什么激发了您的好奇心?您在数据仓库中是否有需要解决的实际问题?
  • @APC 我会称这是一个编程问题,因为我正在用 SQL 编写它,最后我检查它是一种合法的编程语言。如果您愿意,我可以标记此 PL/SQL 并围绕调度程序编写一个 proc。是的,正如我上面的问题所述,我确实有一个实际的数据仓库问题。目前的想法是我将编写一个由调度程序链调用的 PL/SQL 函数。
  • 仍然不确定您的问题是什么。你的意思是“大量的重做”吗?如果是这样,为什么会出现问题?

标签: sql performance oracle plsql data-warehouse


【解决方案1】:

好的,这就是我想出的解决方案,您的里程可能会有所不同,事后对任何反馈表示赞赏。总体策略是执行以下操作:

1) 利用 Oracle 调度器利用链(作业)的并行执行
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;

【讨论】:

  • 您是在 Oracle RAC 还是 Exadata 上运行它?如果您每次执行此操作时确实要加载 10 亿个项目,那么您必须拥有非常强大的硬件。
  • @NWest 我唯一确定的是它是 16 cpu 和 ~128gb ram。
猜你喜欢
  • 2018-03-20
  • 1970-01-01
  • 2012-05-23
  • 1970-01-01
  • 2018-03-30
  • 1970-01-01
  • 2015-05-27
  • 2021-10-14
  • 2014-07-11
相关资源
最近更新 更多