实现的视图(MV) 日志可用于允许MV进行快速刷新,这只会修改已更改的数据。但是,各种条件阻止MV使用日志,因此需要完整的刷新。 Oracle实现了原子完整的刷新,作为每个记录的删除和插入。即使最终没有数据更改,也可以做到这一点。

有没有办法使这种复制智能 关于重做?合并后,删除需要两次查询源。批量收集数据以进行大量合并并删除是值得的吗?有没有更好的办法?

更新:

我使用全球临时表作为登台区进行了探索。尽管他们使用不到一半的重做,但仍然使用了很多。

有帮助吗?

解决方案

这只是为了证明各种用法 insert 操作而不是回答整个问题。我的10G实例的结果不是100%确定性,但是每次跑步时,广泛的情况保持不变。

对于堆桌,我不知道为什么 insert /*+ append */ 产生了更多的重做。

测试床:

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);

测试:

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';

结果:

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                   

其他提示

好问题。不久前,我通过制作MV和对它们的任何索引来“解决”了这个问题。我的处境没有意义 - 无论如何我都对视图进行了全面的刷新,为什么我需要重做?

许可以下: CC-BY-SA归因
不隶属于 dba.stackexchange
scroll top