У меня есть осуществленное представление, определил этот путь:
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';
Я записал как своего рода кэш: исходная таблица огромна, но количество различных пар является довольно небольшим. Мне нужны те пары для присоединений к ним с другими таблицами. Пока неплохо: это абсолютно запросы скоростей.
Но я хочу удостовериться, что представление не содержит устаревшие данные. Базовая таблица изменяется четыре или пять раз в месяц, но я не обязательно знаю когда. Я понимаю, что осуществленное представление может быть определено так, оно обновляет, когда исходные таблицы изменяются. Однако документы становятся симпатичными, усложняют.
Каков точный синтаксис, который я должен использовать?
Я должен создать осуществленный журнал представления?
Каково различие между быстрым и полным обновлением?
, чтобы взять ваши вопросы в обратном порядке
Быстрое обновление также известный как инкрементное освежение. Это должно дать вам ключ к разнице. Полное обновление восстановит весь 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>
. в разделе
в разделе
, хотя они кажутся уменьшаться с каждой новой версией Oracle. в разделе
Указывает, следует ли применять инкрементные или полные обновления. Есть некоторые категории запросов, которые заставляют использование в
означает, что MVIVE обновляется транзакционный (в отличие от по требованию
, который является регулярным обновлением в масса). Обновление
пункты 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
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 для него и обновит этот вопрос, когда он прибудет.
При быстром обновлении в материализованное представление будут вставляться/обновляться/удаляться только измененные данные. Полное обновление опустошит материализованное представление, а затем скопирует его во все строки.
Функция "при фиксации" означает, что материализованное представление будет обновляться всякий раз, когда происходит фиксация изменения в главной таблице. Таким образом, ваш текущий синтаксис будет крайне неэффективным. Каждый раз, когда кто-нибудь изменяет какую-нибудь строку в foo, m_foo будет усечен, а затем каждая строка в таблице foo будет вставлена.
Вы можете сделать лучше с быстрым обновлением, когда только измененные строки в foo будут отправляться в m_foo. Это даст вам последовательность без больших накладных расходов.
создайте материализованный журнал представлений на foo с первичным ключом; -- предполагая, что у вас есть первичный ключ, вы должны создать материализованное представление m_foo refresh быстро при коммите в виде \;
Есть некоторые дополнительные тонкости с грантами и синонимами, если вы используете db-ссылки, или схема, которой владеет foo, не является схемой, которой владеет m_foo.