Материализованные представления: как узнать количество обновлений, вставок и удалений, примененных во время обновления? - PullRequest
6 голосов
/ 22 марта 2012

У меня есть витрина данных, освоенная из нашей базы данных OLTP Oracle с использованием базовых материализованных представлений с возможностью быстрого обновления по требованию. Обновить работает нормально. Что меня интересует в добавлении, так это некоторая статистика об обновлении каждого Материализованного представления, такая как количество вставок, обновлений и удалений, которые были применены к основной таблице с момента последнего обновления, подобного данным, которые я могу найти в user_tab_modifications. Возможно ли это для материализованных представлений?

1 Ответ

6 голосов
/ 22 марта 2012

Перед обновлением вы можете запросить журнал материализованного представления, чтобы посмотреть, какие векторы изменений он хранит.Это будут векторы изменений, которые необходимо применить к материализованному представлению во время процесса обновления (при условии, что существует только одно материализованное представление, зависящее от этого журнала материализованного представления).

Например, если я создаю свойтаблица, мой журнал материализованного представления и мое материализованное представление.

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...