2011-03-04 10 views
5

Supongamos que tengo una tabla TABLE con dos columnas COL_1 y COL_2.Ref. De vista materializada al confirmar

Tengo una vista materializada que simplemente dice TABLE.COL_1, y está configurada para: REFRESH FAST ON COMMIT.

Si actualizo TABLE.COL_2 no, actualice la vista materializada?

Respuesta

4

Sí, parece que la actualización de col_2 también refresca la vista.

Actualizando col_2 utiliza más recursos que una actualización comparable sobre una mesa similar sin una vista materializada. Y actualizar COL_2 actualizará la marca de tiempo de la fila (ORA_ROWSCN) de la vista materializada.

------- 
--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

Gracias, eso es bastante completo. – Johnny5

+0

Supongo que el registro de vista materializada lo determina. Entonces, si creas un registro de vista materializado solo en col1, creo que la actualización de col2 ya no tendrá efecto, ¿correcto? – nathanvda

Cuestiones relacionadas