Быстрое обновление при фиксации материализованного представления

Я только что создал таблицы DEPT и EMP, как показано ниже:

create table DEPT
( dept_no number , dept_name varchar(32) , dept_desc varchar(32),
  CONSTRAINT dept_pk Primary Key (dept_no) );

create table EMP
( emp_no number, dept_no number, CONSTRAINT emp_pk Primary Key (emp_no,dept_no));

insert into dept values (10,'it','desc1');
insert into dept values (20,'hr','desc2');

insert into emp values (1,10);
insert into emp values (2,20);

Я создал журналы материализованных представлений для этих таблиц с rowid и материализованными представлениями следующим образом:

create materialized view log on emp with rowid;
create materialized view log on dept with rowid;

create materialized view empdept_mv refresh fast on commit as
select a.rowid dept_rowid, b.rowid emp_rowid, a.dept_no,b.emp_no
from dept a, emp b
where a.dept_no=b.dept_no ;

select * from emp;
    EMP_NO    DEPT_NO
  ---------- ----------
     1         10
     2         20
     3         30

select * from dept;
   DEPT_NO DEPT_NAME                        DEPT_DESC
---------- -------------------------------- --------------------------------
    10 it                               desc1
    20 hr                               desc2
    30 it                               desc3

select * from empdept_mv;

DEPT_ROWID         EMP_ROWID             DEPT_NO     EMP_NO
------------------ ------------------ ---------- ----------
AAAli5AABAAAPZ6AAA AAAli7AABAAAQs6AAA         10          1
AAAli5AABAAAPZ6AAB AAAli7AABAAAQs6AAB         20          2

Я вставил новую запись и сделал COMMIT; ..но все же, когда я проверяю материализованное представление, новая запись не отображается в материализованном представлении.

insert into dept values (30,'it','desc3');
commit;
insert into emp values (3,30);
commit;

select * from empdept_mv;

DEPT_ROWID         EMP_ROWID             DEPT_NO     EMP_NO
------------------ ------------------ ---------- ----------
AAAli5AABAAAPZ6AAA AAAli7AABAAAQs6AAA         10          1
AAAli5AABAAAPZ6AAB AAAli7AABAAAQs6AAB         20          2

Теперь, когда я запускаю процедуру быстрого и полного обновления как за, быстрое обновление не обновляет Mview, а полное обновление обновляет. (Примечание: Но Mview по-прежнему обновляется при фиксации)

execute DBMS_MVIEW.REFRESH('empdept_mv', 'F', '', TRUE, FALSE, 0,0,0,FALSE, FALSE);
PL/SQL procedure successfully completed.

DEPT_ROWID         EMP_ROWID             DEPT_NO     EMP_NO
------------------ ------------------ ---------- ----------
AAAli5AABAAAPZ6AAA AAAli7AABAAAQs6AAA         10          1
AAAli5AABAAAPZ6AAB AAAli7AABAAAQs6AAB         20          2


execute DBMS_MVIEW.REFRESH('test_mview2', 'C', '', TRUE, FALSE, 0,0,0,FALSE, FALSE);
PL/SQL procedure successfully completed.

DEPT_ROWID         EMP_ROWID             DEPT_NO     EMP_NO
------------------ ------------------ ---------- ----------
AAAli5AABAAAPZ6AAA AAAli7AABAAAQs6AAA         10          1
AAAli5AABAAAPZ6AAB AAAli7AABAAAQs6AAB         20          2
AAAli5AABAAAPZ6AAC AAAli7AABAAAQs6AAC         30          3

Вывод DBMS_MVIEW.EXPLAIN_MVIEW выглядит следующим образом: (имя_возможности - Возможное - msgtxt)

  1. ПКТ --N--
  2. REFRESH_COMPLETE --Y--
  3. REFRESH_FAST --Y--
  4. ПЕРЕПИСАТЬ --N--
  5. PCT_TABLE --N-- Ошибка Oracle: подробности см. В RELATED_NUM и RELATED_TEXT.
  6. REFRESH_FAST_AFTER_INSERT --Y--
  7. REFRESH_FAST_AFTER_ONETAB_DML --Y--
  8. REFRESH_FAST_AFTER_ANY_DML --Y--
  9. REFRESH_FAST_PCT --N-- PCT невозможно ни в одной из подробных таблиц в матери
  10. REWRITE_FULL_TEXT_MATCH --N-- Ошибка Oracle: подробности см. В RELATED_NUM и RELATED_TEXT.
  11. REWRITE_FULL_TEXT_MATCH --N - перезапись запроса отключена для материализованного представления
  12. REWRITE_PARTIAL_TEXT_MATCH --N - материализованное представление не может поддерживать любой тип перезаписи запроса
  13. REWRITE_PARTIAL_TEXT_MATCH --N - перезапись запроса отключена для материализованного представления
  14. REWRITE_GENERAL --N - материализованное представление не может поддерживать любой тип перезаписи запроса
  15. REWRITE_GENERAL --N - перезапись запроса отключена для материализованного представления
  16. REWRITE_PCT --N - общая перезапись невозможна или PCT невозможен на
  17. PCT_TABLE_REWRITE --N-- Ошибка Oracle: подробности см. В RELATED_NUM и RELATED_TEXT.

Как добиться быстрого обновления при фиксации?
Подробная информация о версии Oracle:
NLSRTL 10.2.0.4.0 Production
Oracle Database 10g 10.2.0.4.0 64bit Production
PL / SQL 10.2.0.4.0 в рабочей среде
TNS для Linux: 10.2.0.4.0 в рабочей среде


person Deepak Venga    schedule 20.11.2013    source источник
comment
Меня устраивает. Возможно, вы захотите добавить свой create materialized view log... и свои вставки, чтобы мы могли полностью воспроизвести проблему.   -  person Jon Heller    schedule 20.11.2013
comment
Вы не показали никаких данных и не указали, в какую таблицу вы вставили строку. Вы видите новую строку при запуске оператора select, который определяет запрос MV?   -  person David Aldridge    schedule 21.11.2013
comment
Я включил все инструкции вставки. Да, я могу видеть новую строку после вставки в таблицу.   -  person Deepak Venga    schedule 21.11.2013


Ответы (2)


Я не знаю, сохраняется ли проблема, но когда я взглянул на предоставленную вами статью, я кое-что заметил (что может быть здесь решением):

ON COMMIT Refresh

Материализованное представление можно обновить автоматически с помощью метода ON COMMIT. Следовательно, всякий раз, когда фиксируется транзакция, обновляющая таблицы, в которых определено материализованное представление, эти изменения автоматически отражаются в материализованном представлении. Преимущество использования этого подхода в том, что вам никогда не нужно помнить об обновлении материализованного представления. Единственный недостаток заключается в том, что время, необходимое для завершения фиксации, будет немного больше из-за дополнительной обработки. Однако в хранилище данных это не должно быть проблемой, поскольку параллельные процессы маловероятны. пытаюсь обновить ту же таблицу.

  • Обратите внимание на жирную линию.

Тогда у нас есть:

Таблица 7-1 Способы обновления ПО ТРЕБОВАНИЮ

Параметр обновления Параметр Описание ЗАВЕРШИТЬ C Обновляется путем пересчета определяющего запроса материализованного представления.

БЫСТРО F Обновляется путем постепенного применения изменений к материализованному представлению. Для локальных материализованных представлений он выбирает метод обновления, который, по оценке оптимизатора, является наиболее эффективным. Рассматриваемые методы обновления - это FAST на основе журнала и FAST_PCT.

FAST_PCT P Обновляется путем пересчета строк в материализованном представлении, затронутых измененными разделами в подробных таблицах.

ПРИНУДИТЕ? Пытается выполнить быстрое обновление. Если это невозможно, выполняется полное обновление. Для локальных материализованных представлений он выбирает метод обновления, который, по оценке оптимизатора, является наиболее эффективным. Рассматриваются следующие методы обновления: FAST, FAST_PCT и COMPLETE на основе журнала.

  • Обратите внимание на жирные линии.
  • Лично я предпочитаю вариант FORCE.

Не могли бы вы сказать, произойдет ли это снова через некоторое время (в зависимости от параметров БД и машины, на которой она работает, поэтому я даже не могу вам намекнуть, сколько)?

Когда возможно быстрое обновление

Не все материализованные представления можно быстро обновлять. Поэтому используйте пакет DBMS_MVIEW.EXPLAIN_MVIEW, чтобы определить, какие методы обновления доступны для материализованного представления.

Если вы не знаете, как сделать материализованное представление быстро обновляемым, вы можете использовать процедуру DBMS_ADVISOR.TUNE_MVIEW, которая предоставляет сценарий, содержащий инструкции, необходимые для создания быстро обновляемого материализованного представления.

Ваше здоровье

person g00dy    schedule 25.07.2014

Я вижу, что вы создали журналы материализованного представления с ROWID, что на самом деле не требуется, поскольку обе таблицы имеют первичный ключ, поэтому вы можете попробовать без ROWID.

создать материализованный журнал просмотра на emp; создать материализованный журнал просмотра в отделе;

Кроме того, если вы создаете журнал материализованного представления с ROWID, вы должны создать материализованное представление с rowid.

создать материализованное представление empdept_mv, быстрое обновление при фиксации С ROWID, как выберите a.rowid dept_rowid, b.rowid emp_rowid, a.dept_no, b.emp_no из dept a, emp b, где a.dept_no = b.dept_no;

Вы можете попробовать эти изменения и посмотреть, быстро ли обновляются материализованные представления при фиксации.

person Dxxg    schedule 19.12.2013