限制重做实体视图的完整刷新或手动等效的
-
16-10-2019 - |
题
实现的视图(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和对它们的任何索引来“解决”了这个问题。我的处境没有意义 - 无论如何我都对视图进行了全面的刷新,为什么我需要重做?
不隶属于 dba.stackexchange