Woo*_*Moo 5 sql oracle performance plsql data-warehouse
我有一个系统,其物化视图包含大约10亿个项目,在一个两小时的基础上,我需要更新大约2亿个(20%的记录).我的问题是我的物化视图上的刷新策略应该是什么?截至目前,它是一个间隔刷新.我很好奇刷新间隔副刷新之间的性能影响,并重新命名/替换旧的物化视图与新的物化视图.潜在的问题是Oracle使用的索引,它创建了大量的重做.任何建议表示赞赏.
更新
由于有些人似乎认为这不是主题,我当前的观点是执行以下操作:
创建一个Oracle调度链,调用一系列PL/SQL(编程语言I promise)函数,以伪并行方式刷新实体化视图.然而,就好像我落入了DBA的位置,我希望用算法和/或一些代码来解决数据问题.
好的,这是我想出的解决方案,您的里程可能会有所不同,事后我们将不胜感激任何反馈。总体策略是执行以下操作:
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)
| 归档时间: |
|
| 查看次数: |
1654 次 |
| 最近记录: |