Базы данных Oracle - статьи

         

Задание схемы обновления


Указание объема вычислений при обновлении

Синтаксически для указания метода обновления используются следующие ключевые слова во фразе REFRESH:

  • REFRESH COMPLETE: указывает СУБД, что при автоматическом обновлении хранимого результата он будет перевычисляться полностью путем повторения оператора SELECT, сформулированного для materialized view. Это гарантированно надежный вариант обновления.
  • REFRESH FAST: указывает СУБД, что при неявном обновлении в хранимый результат будут вноситься изменения на основе информации, собранной в журналах базовых таблиц. Это более быстрый вариант.
  • REFRESH FORCE: указывает СУБД выбрать режим FAST, если это возможно, иначе - COMPLETE. Это вариант по умолчанию.

    Примеры:

    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 для указания времени осуществления обновлений:

  • ON COMMIT: режим, при котором обновление хранимого результата будет производиться по всякой фиксации транзакции (COMMIT). Время фиксации возрастет.
  • ON DEMAND: режим, при котором обновление будет осуществляться процедурами из состава системного пакета DBMS_MVIEW.
    • o START WITH первый_раз NEXT потом: обновление будет выполнено единожды первый_раз, после чего автоматически повторяться по формуле, вычисляемой потом. Может быть только уточнением к режиму ON DEMAND.

      Автоматическое выполнение обновлений по графику возможно только в случае, если в составе СУБД запущены необязательные фоновые процессы 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 при попытке автоматического обновления хранимых агрегатов (например, сумм) после обновления полей с исходными данными.



      Содержание раздела