Oracle: материализованное представление только для вставки

В Oracle, что такое материализованное представление только для вставки?

У меня есть следующее материализованное представление, которое использует MAX агрегатная функция:

CREATE MATERIALIZED VIEW VM_FAST_MAX
REFRESH FAST ON COMMIT
AS
SELECT   d.ID_INPUT, MAX(d.ID_LOAD) AS ID_LOAD, COUNT(*) AS CNT
FROM     MASTER_TABLE d
GROUP BY d.ID_INPUT;

Согласно руководству по хранилищу данных Oracle, это должно быть материализованное представление только для вставки:

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

  • Материализованные представления с агрегатами MIN или MAX
  • Материализованные представления, которые имеют SUM(expr), но не COUNT(expr)
  • Материализованные представления без COUNT(*)

Такое материализованное представление называется только материализованным представлением.

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

EXEC DBMS_MVIEW.EXPLAIN_MVIEW('VM_FAST_MAX');
SELECT CAPABILITY_NAME, POSSIBLE
FROM MV_CAPABILITIES_TABLE
WHERE MVNAME = 'VM_FAST_MAX';

CAPABILITY_NAME                P
------------------------------ -
REFRESH_FAST_AFTER_INSERT      Y
REFRESH_FAST_AFTER_ANY_DML     Y

И быстрое обновление при фиксации работает даже после обновления на главной таблице.

Подведем итог:

  • В чем разница между материализованным представлением только со вставкой и простым быстро обновляемым материализованным представлением?
  • Почему документация Oracle лежит на мне?:)

Использование Oracle 11.2 Enterprise Edition.

1 ответ

Решение

Разница между обычным быстро обновляемым mview и mview только для вставки, как вы сказали, заключается в том, что обновляемое mview только для вставки можно быстро обновить только после состояния вставки, а не после какой-либо другой операции DML (например, удаления и обновления).

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

Что касается таблицы возможностей - это странно. Проверьте эту страницу - это сделал тот же тест, но в своем примере они получили

Capable of:
  REFRESH_FAST
  REFRESH_FAST_AFTER_INSERT
Not Capable of:
  REFRESH_FAST_AFTER_ONETAB_DML
    AMT_SUM
    SUM(expr) without COUNT(expr)
  REFRESH_FAST_AFTER_ONETAB_DML
    COUNT(*) is not present in the select list
  REFRESH_FAST_AFTER_ANY_DML
    see the reason why REFRESH_FAST_AFTER_ONETAB_DML is disabled

Вы пытались выполнить быстрое обновление после обновления?

Другие вопросы по тегам