6

Suppose I have a table TABLE with two columns COL_1 and COL_2.

I have a materialized view that simply reads TABLE.COL_1, and is set for: REFRESH FAST ON COMMIT.

If I update TABLE.COL_2, does the materialized view refresh?

OMG Ponies
  • 325,700
  • 82
  • 523
  • 502
Johnny5
  • 6,664
  • 3
  • 45
  • 78

1 Answers1

4

Yes, it appears that updating COL_2 also refreshes the view.

Updating COL_2 uses more resources than a comparable update on a similar table without a materialized view. And updating COL_2 will update the row timestamp (ORA_ROWSCN) of the materialized view.

-------
--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
Jon Heller
  • 34,999
  • 6
  • 74
  • 132
  • Thanks, that's pretty comprehensive. – Johnny5 Mar 07 '11 at 17:17
  • My guess is the materialized view log determines this. So if you create a materialized view log only on col1 I think updating col2 will not have an effect anymore, correct? – nathanvda Feb 23 '16 at 16:44