Обновите осуществленное представление, когда urderlying таблицы изменятся

У меня есть осуществленное представление, определил этот путь:

CREATE MATERIALIZED VIEW M_FOO
REFRESH COMPLETE ON COMMIT
AS
    SELECT FOO_ID, BAR
    FROM FOO
    WHERE BAR IS NOT NULL
    GROUP BY FOO_ID, BAR
/

COMMENT ON MATERIALIZED VIEW M_FOO IS 'Foo-Bar pairs';

Я записал как своего рода кэш: исходная таблица огромна, но количество различных пар является довольно небольшим. Мне нужны те пары для присоединений к ним с другими таблицами. Пока неплохо: это абсолютно запросы скоростей.

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

  1. Каков точный синтаксис, который я должен использовать?

  2. Я должен создать осуществленный журнал представления?

  3. Каково различие между быстрым и полным обновлением?

11
задан Álvaro González 8 January 2010 в 13:26
поделиться

2 ответа

, чтобы взять ваши вопросы в обратном порядке

Быстрое обновление также известный как инкрементное освежение. Это должно дать вам ключ к разнице. Полное обновление восстановит весь MVIEW с нуля, тогда как быстрое обновление применяется только изменения от DML, выполненных против таблицы питателя.

Для того, чтобы выполнить быстрые обновления, вам нужен подходящий журнал MVIIек. Эти треки меняются в данных базовых таблиц, что позволяет Oracle эффективно применять Delta на материализованный вид, а не запросить всю таблицу.

Что касается синтаксиса, вот основы:

SQL> create materialized view log on emp
  2  with rowid, primary key, sequence (deptno, job)
  3  including new values
  4  /

Materialized view log created.

SQL> create materialized view emp_mv
  2  refresh fast on commit
  3  as
  4  select deptno, job from emp
  5  group by deptno, job
  6  /

Materialized view created.

SQL>

. в разделе в разделе в разделе в означает, что MVIVE обновляется транзакционный (в отличие от по требованию , который является регулярным обновлением в масса). Обновление пункты Указывает, следует ли применять инкрементные или полные обновления. Есть некоторые категории запросов, которые заставляют использование Complete обновления , хотя они кажутся уменьшаться с каждой новой версией Oracle.

Быстрый тест, чтобы увидеть, что он работает ...

SQL> select * from emp_mv
  2  order by deptno, job
  3  /

    DEPTNO JOB
---------- ---------
        10 MANAGER
        10 PRESIDENT
        10 SALES
        20 ANALYST
        20 CLERK
        20 MANAGER
        30 CLERK
        30 MANAGER
        30 SALESMAN
        40 CLERK
        40 DOGSBODY

11 rows selected.

SQL>

Как насчет новой записи?

SQL> insert into emp (empno, ename, deptno, job)
  2  values (6666, 'GADGET', 40, 'INSPECTOR')
  3  /

1 row created.

SQL> commit
  2  /

Commit complete.

SQL> select * from emp_mv
  2  order by deptno, job
  3  /

    DEPTNO JOB
---------- ---------
        10 MANAGER
        10 PRESIDENT
        10 SALES
        20 ANALYST
        20 CLERK
        20 MANAGER
        30 CLERK
        30 MANAGER
        30 SALESMAN
        40 CLERK
        40 DOGSBODY
        40 INSPECTOR

12 rows selected.

SQL>

Вы можете найти более подробную информацию о синтаксисе в Ссылка SQL . Также стоит читать Материализированную главу представления в Руководстве складирования данных .


Несмотря на обеспокоенность комментаторов ниже, это работает как рекламируется. К сожалению, обычные места для публикации демонстраций (SQL Widdle, DB <> Widdle) не допускают материализованные виды. Я опубликовал что-то на Oracle SQL Live (требуется бесплатная учетная запись Oracle): я ожидаю одобрения Oracle для него и обновит этот вопрос, когда он прибудет.

20
ответ дан 3 December 2019 в 03:18
поделиться

При быстром обновлении в материализованное представление будут вставляться/обновляться/удаляться только измененные данные. Полное обновление опустошит материализованное представление, а затем скопирует его во все строки.

Функция "при фиксации" означает, что материализованное представление будет обновляться всякий раз, когда происходит фиксация изменения в главной таблице. Таким образом, ваш текущий синтаксис будет крайне неэффективным. Каждый раз, когда кто-нибудь изменяет какую-нибудь строку в foo, m_foo будет усечен, а затем каждая строка в таблице foo будет вставлена.

Вы можете сделать лучше с быстрым обновлением, когда только измененные строки в foo будут отправляться в m_foo. Это даст вам последовательность без больших накладных расходов.

создайте материализованный журнал представлений на foo с первичным ключом; -- предполагая, что у вас есть первичный ключ, вы должны создать материализованное представление m_foo refresh быстро при коммите в виде \;

Есть некоторые дополнительные тонкости с грантами и синонимами, если вы используете db-ссылки, или схема, которой владеет foo, не является схемой, которой владеет m_foo.

8
ответ дан 3 December 2019 в 03:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: