Lei*_*fel 10 oracle oracle-11g-r2 materialized-view
物化视图(MV)日志可用于允许 MV 进行快速刷新,仅修改已更改的数据。但是,各种条件会阻止 MV 使用日志,因此需要完全刷新。Oracle 实现了原子完全刷新作为每条记录的删除和插入。即使最终没有对数据进行更改,它也会这样做。
有没有办法让这个复制在重做生成方面变得智能?MERGE 后跟 DELETE 需要查询源两次。批量收集数据以进行批量合并和删除是否值得?有没有更好的办法?
更新:
我探索了使用全局临时表作为暂存区。虽然他们使用的重做不到一半,但他们仍然使用了很多。
这只是为了演示各种insert操作的重做用法,而不是回答整个问题。我的 10g 实例上的结果不是 100% 确定的,但每次运行时总体情况都保持不变。
对于堆表,不知道为什么insert /*+ append */生成的redo 比较多。
试验台:
create table heap_noappend(id integer, dummy char(500));
create table heap_append(id integer, dummy char(500));
create global temporary table gtt_noappend(id integer, dummy char(500));
create global temporary table gtt_append(id integer, dummy char(500));
create global temporary table gtt_results(stage integer, val integer);
Run Code Online (Sandbox Code Playgroud)
测试:
insert into gtt_results(stage, val)
select 0, value from v$statname join v$sesstat using(statistic#)
where sid=sys_context('userenv','sid') and name='redo size';
insert into heap_noappend(id, dummy)
select level, 'A' from dual connect by level<1000;
insert into gtt_results(stage, val)
select 1, value from v$statname join v$sesstat using(statistic#)
where sid=sys_context('userenv','sid') and name='redo size';
insert /*+ append */ into heap_append(id, dummy)
select level, 'A' from dual connect by level<1000;
insert into gtt_results(stage, val)
select 2, value from v$statname join v$sesstat using(statistic#)
where sid=sys_context('userenv','sid') and name='redo size';
insert into gtt_noappend(id, dummy)
select level, 'A' from dual connect by level<1000;
insert into gtt_results(stage, val)
select 3, value from v$statname join v$sesstat using(statistic#)
where sid=sys_context('userenv','sid') and name='redo size';
insert /*+ append */ into gtt_append(id, dummy)
select level, 'A' from dual connect by level<1000;
insert into gtt_results(stage, val)
select 4, value from v$statname join v$sesstat using(statistic#)
where sid=sys_context('userenv','sid') and name='redo size';
Run Code Online (Sandbox Code Playgroud)
结果:
select *
from( select decode(stage,1,'heap noappend',
2,'heap append',
3,'gtt noappend',
4,'gtt append') as operation,
val-lag(val) over(order by stage) as redo
from gtt_results)
where redo is not null;
OPERATION REDO
------------- ----------------------
heap noappend 606932
heap append 690768
gtt noappend 41488
gtt append 256
Run Code Online (Sandbox Code Playgroud)