Указание объема вычислений при обновлении
Синтаксически для указания метода обновления используются следующие ключевые слова во фразе REFRESH:
Примеры:
DROP MATERIALIZED VIEW LOG ON emp;
CREATE MATERIALIZED VIEW LOG ON emp WITH (sal,comm), ROWID INCLUDING NEW VALUES;
ALTER MATERIALIZED VIEW jobsal REFRESH FAST;
DROP MATERIALIZED VIEW LOG ON emp;
ALTER MATERIALIZED VIEW jobsal REFRESH COMPLETE;
Пример показывает, что экономное обновление агрегирующего хранимого результата возможно только при выполнении некоторых условий на полноту журнальной таблицы.
Указание времени обновления
Синтаксические конструкции фразы REFRESH для указания времени осуществления обновлений:
Автоматическое выполнение обновлений по графику возможно только в случае, если в составе СУБД запущены необязательные фоновые процессы SNPn. Их запуск достигается путем указания параметра СУБД JOB_QUEUE_PROCESSES. До версии 9 умолчанием для него был 0.
Пример:
CREATE MATERIALIZED VIEW LOG ON emp WITH ROWID INCLUDING NEW VALUES;
ALTER MATERIALIZED VIEW jobsal REFRESH START WITH SYSDATE NEXT SYSDATE+1/1440;
COMMIT;
SELECT * FROM jobsal;
Примеры обновлений в режиме ON COMMIT:
DROP MATERIALIZED VIEW LOG ON emp;
CREATE MATERIALIZED VIEW emp2 REFRESH COMPLETE ON COMMIT AS SELECT * FROM emp;
CREATE MATERIALIZED VIEW jobtotals REFRESH ON COMMIT AS SELECT job, COUNT(*), COUNT(comm), SUM(comm), SUM(sal) FROM emp GROUP BY job;
Проверка:
UPDATE emp SET sal = 8000 WHERE ename = 'SMITH';
SELECT sal FROM emp2 WHERE ename = 'SMITH';
SELECT * FROM jobtotals;
COMMIT;
SELECT sal FROM emp2 WHERE ename = 'SMITH';
SELECT * FROM jobtotals;
Можно заметить, что последний пример позволяет обойти проблему Mutating Trigger при попытке автоматического обновления хранимых агрегатов (например, сумм) после обновления полей с исходными данными.