2011-03-04 13 views

cevap

4

Evet, COL_2 güncelleştirmesinin görünümü de yenilediği anlaşılıyor.

COL_2 güncellenmesi, benzer bir görünümde benzer bir tabloda benzer bir güncellemeden daha fazla kaynak kullanır. Ve COL_2 güncellenmesi, gerçekleşen görünümün satır zaman damgasını (ORA_ROWSCN) güncelleyecektir.

------- 
--Compare the amount of work done to update. 
--The difference isn't huge, but is significant and consistent. 
------- 

--Create table and materialized view 
create table table1 (col_1 number primary key, col_2 number); 
create materialized view log on table1; 
create materialized view table1_mv refresh fast on commit 
    as select col_1 from table1; 
insert into table1 values(1, 1); 
commit; 

--Create a regular table for comparison 
create table table2 (col_1 number primary key, col_2 number); 
insert into table2 values(1, 1); 
commit; 

--Parse the queries so traces won't count that work. 
update table1 set col_1 = 2; 
update table1 set col_2 = 2; 
update table2 set col_1 = 2; 
update table2 set col_2 = 2; 
rollback; 

set autotrace on 
alter system flush buffer_cache; 
update table1 set col_1 = 2; 
--   11 db block gets 
--   8 consistent gets 
--   13 physical reads 

rollback; 
alter system flush buffer_cache; 
update table1 set col_2 = 2; 
--   6 db block gets 
--   8 consistent gets 
--   12 physical reads 

rollback; 
alter system flush buffer_cache;  
update table2 set col_1 = 2; 
--   7 db block gets 
--   7 consistent gets 
--   9 physical reads 

rollback; 
alter system flush buffer_cache; 
update table2 set col_2 = 2; 
--   3 db block gets 
--   7 consistent gets 
--   8 physical reads 

set autotrace off 


------- 
--Compare ORA_ROWSCN. 
--The times are different, implying the materialized view was modified. 
------- 

--(You may need to run these steps slowly to reproduce. ORA_ROWSCN is 
--not perfect, sometimes you'll see the same timestamp.) 
select scn_to_timestamp(ora_rowscn) from table1_mv; 
    --3/5/2011 12:25:25.000000000 AM 
update table1 set col_1 = 3; 
commit; 
select scn_to_timestamp(ora_rowscn) from table1_mv; 
    --3/5/2011 12:25:37.000000000 AM 
update table1 set col_2 = 3; 
commit; 
select scn_to_timestamp(ora_rowscn) from table1_mv; 
    --3/5/2011 12:25:46.000000000 AM 
+0

Teşekkürler, bu oldukça kapsamlı. – Johnny5

+0

Tahminimce, materyalize edilmiş görünüm günlüğü bunu belirler. Dolayısıyla, yalnızca col1'de materyalize edilmiş bir görünüm günlüğü oluşturursanız, col2'nin güncellenmesinin artık bir etkisi olmayacağını düşünüyorum, doğru mu? – nathanvda