Может ли работать быстрое обновление материализованного представления, если представления основаны на таблицах?

Я просматриваю настройку базы данных моей команды, уделяя особое внимание материализованным представлениям. В большинстве случаев в настоящее время мы выполняем «полные» обновления, и я хочу перейти к быстрому обновлению.

В некоторых случаях это просто — MV основан непосредственно на таблице в нашей исходной базе данных, и я могу включить MVIEW LOGS для таблицы и воссоздать MV.

Но в ряде случаев MV основаны на комбинации других MV, представлений и т. д., которые проходят несколько уровней вглубь, прежде чем я доберусь до таблиц в нашей исходной базе данных.

В этих случаях, если я отследю окончательные исходные таблицы, позволит ли включение MVIEW LOGS для них использовать быстрое обновление для основного MV и любых промежуточных MV?


person MidnightThoughtful    schedule 07.07.2015    source источник


Ответы (2)


документация Oracle содержит пример FAST REFRESH материализованного представления. на основе представления UNION ALL:

CREATE VIEW view_with_unionall AS
(SELECT c.rowid crid, c.cust_id, 2 umarker
 FROM customers c WHERE c.cust_last_name = 'Smith'
 UNION ALL
 SELECT c.rowid crid, c.cust_id, 3 umarker
 FROM customers c WHERE c.cust_last_name = 'Jones');

CREATE MATERIALIZED VIEW unionall_inside_view_mv
REFRESH FAST ON DEMAND AS
SELECT * FROM view_with_unionall;

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

Некоторые вещи, которые следует отметить:

  • есть несколько ограничений для быстро обновляемых материализованных представлений. Например. вы не можете использовать ROWNUM, SYSDATE или HAVING. Подробнее см. в документах.
  • несколько парадоксально, FAST REFRESH не всегда быстрее, чем COMPLETE REFRESH. Это зависит от объема данных, которые изменились с момента последнего обновления; ИМХО, вместо этого Oracle следовало использовать термин INCREMENTAL REFRESH
person Frank Schmitt    schedule 07.07.2015

Oracle предоставляет для этого процедуру: DBMS_MVIEW.EXPLAIN_MVIEW

Вы можете использовать эту процедуру, чтобы проверить, способны ли ваши материализованные представления для FAST REFRESH, она также сообщает вам причину, по которой это не так.

Для меня самым странным ограничением для FAST REFRESH является следующее: когда вы объединяете несколько таблиц, вы должны использовать (старый) синтаксис соединения Oracle, синтаксис соединения ANSI не работает. Некоторое время назад был создан запрос в поддержку Oracle по этой проблеме, однако ответ от Oracle был: «Это не ошибка, это просто отсутствие документации». (!)

Я не знаю, применимо ли это все еще к версии Oracle 12c.

person Wernfried Domscheit    schedule 07.07.2015