Oracle - Что происходит при обновлении представления «REFRESH FORCE ON DEMAND» с помощью DBMS_MVIEW.REFRESH

У меня есть следующее материализованное представление -

CREATE MATERIALIZED VIEW TESTRESULT 
ON PREBUILT TABLE WITH REDUCED PRECISION
REFRESH FORCE ON DEMAND
WITH PRIMARY KEY
AS 
SELECT...
FROM...
WHERE...

Это материализованное представление не имеет поддержки MATERIALIZED VIEW LOG. Как видно из пункта выше, в этом MV указано «ПО ТРЕБОВАНИЮ» и, согласно документации Oracle,

«[ПО ЗАПРОСУ] указывает [s], что материализованное представление будет обновлено по запросу путем вызова одной из трех процедур обновления DBMS_MVIEW».

Что происходит, когда я вызываю DBMS_MVIEW.REFRESH ('TESTRESULT')? Проверяется ли вручную каждая запись на предмет обновления?

Версия Oracle: 10g


person contactmatt    schedule 14.06.2011    source источник


Ответы (1)


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

dbms_mview.refresh( 'TESTRESULT', atomic_refresh => false );

Это приведет к усечению материализованного представления, повторному выполнению запроса и вставке результатов в материализованное представление посредством вставки прямого пути. Это будет более эффективно, чем атомарное обновление, но материализованное представление будет пустым во время обновления.

person Justin Cave    schedule 14.06.2011
comment
+1 @Justin .. Кроме того, что произойдет, если я создал MVIEW с NOLOGGING? MVIEW, который я создал, продолжает ошибаться с UNDOTBS small .. ATOMIC_REFRESH поможет? - person Guru; 15.06.2011
comment
@guru - Если я правильно понял, у вас ошибка ORA-01555, верно? Это означает, что проблема в том, что запрашиваемые вами таблицы изменяются, и ваше обновление не может обеспечить согласованное представление данных в том виде, в котором они существовали на момент запуска обновления. Обычно это означало бы, что параметр UNDO_RETENTION и / или табличное пространство UNDO слишком малы и должны быть увеличены. Возможно, вы также можете уменьшить время, необходимое для обновления, которое будет выполнено ATOMIC_REFRESH. - person Justin Cave; 15.06.2011
comment
Я далеко от своего офисного ПК, мне нужно подождать, чтобы получить точную ошибку ORA. При поиске Том Кайт тоже упомянул о 01555. Но вот что я делаю. Я создаю MVIEW на основе большой таблицы. Это займет около 40-60 минут. Размер MVIEW составляет 35-40 ГБ. Когда я обновляю (завершаю) его с помощью DBMS_MVIEW, скрипт запускается в течение 2-3 часов и выдает ошибки с размером пути MVIEW REFRESH PATH. - person Guru; 15.06.2011