好的,这是我想出的解决方案,您的里程可能会有所不同,事后感谢您的任何反馈。总体策略是执行以下操作:
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;