Oracle
限制物化視圖完全刷新或手動等效的重做
物化視圖(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