You can define multiple Materialized Views against the same Source Table with differences in :
a) the SELECT clause column list
b) Predicates in the WHERE clause
c) Joins to one or more other Source Table(s) in the FROM clause
d) Aggregates in the SELECT clause
Thus, for my Source Table, I can add another Materialized View :
Now that there are two MVs referencing the Source Table, the MV Log is not completely purged when only one of the two MVs is refreshed. Oracle still maintains entries in the MV Log for the second MV to be able to execute a Refresh.
a) the SELECT clause column list
b) Predicates in the WHERE clause
c) Joins to one or more other Source Table(s) in the FROM clause
d) Aggregates in the SELECT clause
Thus, for my Source Table, I can add another Materialized View :
SQL> create materialized view mv_2 2 refresh on demand 3 as select id, data_element_2 4 from source_table; Materialized view created. SQL> SQL> select count(*) from mlog$_source_table; COUNT(*) ---------- 0 SQL> insert into source_table 2 values (5, 'Fifth','Five',sysdate); 1 row created. SQL> commit; Commit complete. SQL> select count(*) from mlog$_source_table; COUNT(*) ---------- 1 SQL> SQL> execute dbms_mview.refresh('MV_OF_SOURCE'); PL/SQL procedure successfully completed. SQL> select * from mv_of_source; ID DATA_ELEMENT_1 DATA_ELEMENT_2 DATE_COL ---------- --------------- --------------- --------- 5 Fifth Five 16-SEP-19 101 First One 18-AUG-19 103 Third Three 18-AUG-19 104 Fourth Updated 09-SEP-19 SQL> select count(*) from mlog$_source_table; COUNT(*) ---------- 1 SQL>
Now that there are two MVs referencing the Source Table, the MV Log is not completely purged when only one of the two MVs is refreshed. Oracle still maintains entries in the MV Log for the second MV to be able to execute a Refresh.
SQL> select * from mlog$_source_table; ID SNAPTIME$ D O ---------- --------- - - CHANGE_VECTOR$$ -------------------------------------------------------------------------------- XID$$ ---------- 5 16-SEP-19 I N FE 5.6299E+14 SQL> execute dbms_mview.refresh('MV_2'); PL/SQL procedure successfully completed. SQL> select * from mlog$_source_table; no rows selected SQL> select * from mv_2; ID DATA_ELEMENT_2 ---------- --------------- 101 One 103 Three 104 Updated 5 Five SQL>
The MV Log is "purged" only when the second (actually the last) MV executes a Refresh. Of course, if more rows were inserted / updated in the Source Table between the Refresh of MV_OF_SOURCE and MV_2, there would be corresponding entries in the MV Log.
So, Oracle does use some mechanism to track MVs that execute Refresh's and does continue to "preserve" rows in the MV Log for MVs that haven't been refreshed yet.
As I've noted in two earlier posts, in 2007 and 2012, the MV Log (called "Snapshot Log" in the 2007 post) can keep growing for a long time if you have one or more Materialized Views that just aren't executing their Refresh calls.
No comments:
Post a Comment