Перед обновлением вы можете запросить журнал материализованного представления, чтобы посмотреть, какие векторы изменений он хранит.Это будут векторы изменений, которые необходимо применить к материализованному представлению во время процесса обновления (при условии, что существует только одно материализованное представление, зависящее от этого журнала материализованного представления).
Например, если я создаю свойтаблица, мой журнал материализованного представления и мое материализованное представление.
SQL> create table foo( col1 number primary key);
Table created.
SQL> create materialized view log on foo;
Materialized view log created.
SQL> ed
Wrote file afiedt.buf
1 create materialized view mv_foo
2 refresh fast on demand
3 as
4 select *
5* from foo
SQL> /
Materialized view created.
SQL> insert into foo values( 1 );
1 row created.
SQL> insert into foo values( 2 );
1 row created.
SQL> commit;
Commit complete.
Теперь я обновляю материализованное представление и проверяю, что таблица и материализованное представление синхронизированы
SQL> exec dbms_mview.refresh( 'MV_FOO' );
PL/SQL procedure successfully completed.
SQL> select * from user_tab_modifications where table_name = 'MV_FOO';
no rows selected
SQL> select * from foo;
COL1
----------
1
2
SQL> select * from mv_foo;
COL1
----------
1
2
.два объекта синхронизированы, журнал материализованного представления пуст (журнал материализованного представления будет иметь имя MLOG$_<<table name>>
SQL> select * from mlog$_foo;
no rows selected
Теперь, если я вставлю новую строку в таблицу, я увижустрока в журнале материализованного представления с DMLTYPE$$
из I
, указывающим INSERT
SQL> insert into foo values( 3 );
1 row created.
SQL> select * from mlog$_foo;
COL1 SNAPTIME$ D O
---------- --------- - -
CHANGE_VECTOR$$
--------------------------------------------------------------------------------
XID$$
----------
3 01-JAN-00 I N
FE
2.2519E+15
Так что вы можете сделать что-то вроде этого, чтобы получить количество ожидающих вставок, обновлений и удалений.
SELECT SUM( CASE WHEN dmltype$$ = 'I' THEN 1 ELSE 0 END ) num_pending_inserts,
SUM( CASE WHEN dmltype$$ = 'U' THEN 1 ELSE 0 END ) num_pending_updates,
SUM( CASE WHEN dmltype$$ = 'D' THEN 1 ELSE 0 END ) num_pending_deletes
FROM mlog$_foo
Однако после обновления журнала материализованного представления эта информация исчезает.
С другой стороны, USER_TAB_MODIFICATIONS
должен отслеживать приблизительное число of Изменения, которые были внесены в материализованное представление с момента последнего сбора статистики, точно так же, как оно будет отслеживать информацию для таблицы.Вам почти наверняка понадобится вызвать DBMS_STATS.FLUSH_DATABASE_MONITORING_INFO
, чтобы сделать данные видимыми, если вы хотите захватить данные до и после обновления материализованного представления.
SELECT inserts, updates, deletes
INTO l_starting_inserts,
l_starting_updates,
l_starting_deletes
FROM user_tab_modifications
WHERE table_name = 'MV_FOO';
dbms_mview.refresh( 'MV_FOO' );
dbms_stats.flush_database_monitoring_info;
SELECT inserts, updates, deletes
INTO l_ending_inserts,
l_ending_updates,
l_ending_deletes
FROM user_tab_modifications
WHERE table_name = 'MV_FOO';
l_incremental_inserts := l_ending_inserts - l_starting_inserts;
l_incremental_updates := l_ending_updates - l_starting_updates;
l_incremental_deletes := l_ending_deletes - l_starting_deletes;