6 Stimmen

Materialisierte Ansicht Aktualisierung bei Commit

Angenommen, ich habe eine Tabelle TABLE mit zwei Spalten COL_1 und COL_2.

Ich habe eine materialisierte Ansicht, die einfach TABLE.COL_1 liest und auf REFRESH FAST ON COMMIT eingestellt ist.

Wenn ich TABLE.COL_2 aktualisiere, wird die materialisierte Ansicht dann aktualisiert?

4voto

Jon Heller Punkte 33222

Ja, es scheint, dass das Aktualisieren von COL_2 auch die Ansicht aktualisiert.

Das Aktualisieren von COL_2 verwendet mehr Ressourcen als ein vergleichbares Update auf einer ähnlichen Tabelle ohne materialisierte Ansicht. Und das Aktualisieren von COL_2 aktualisiert den Zeilenzeitstempel (ORA_ROWSCN) der materialisierten Ansicht.

-------
--Vergleichen Sie die Menge der durchgeführten Arbeit.
--Der Unterschied ist nicht riesig, aber signifikant und konsistent.
-------

--Tabelle und materialisierte Ansicht erstellen
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;

--Eine reguläre Tabelle zum Vergleich erstellen
create table table2 (col_1 number primary key, col_2 number);
insert into table2 values(1, 1);
commit;

--Die Abfragen parsen, damit die Traces diese Arbeit nicht zählen.
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

-------
--Vergleichen Sie ORA_ROWSCN.
--Die Zeiten sind unterschiedlich, was darauf hindeutet, dass die materialisierte Ansicht geändert wurde.
-------

--(Sie müssen diese Schritte möglicherweise langsam ausführen, um sie zu reproduzieren. ORA_ROWSCN ist
--nicht perfekt, manchmal sehen Sie den gleichen Zeitstempel.)
select scn_to_timestamp(ora_rowscn) from table1_mv;
    --5. März 2011 00:25:25.000000000
update table1 set col_1 = 3;
commit;
select scn_to_timestamp(ora_rowscn) from table1_mv;
    --5. März 2011 00:25:37.000000000
update table1 set col_2 = 3;
commit;
select scn_to_timestamp(ora_rowscn) from table1_mv;
    --5. März 2011 00:25:46.000000000

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X