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
Вы пытались выполнить быстрое обновление после обновления?