Oracle

限制物化視圖完全刷新或手動等效的重做

  • June 6, 2012

物化視圖(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);

測試:

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                   

引用自:https://dba.stackexchange.com/questions/3251