Oracle - Как создать материализованное представление с помощью FAST REFRESH и JOINS
Итак, я уверен, что Oracle поддерживает это, поэтому я понятия не имею, что я делаю неправильно. Этот код работает:
CREATE MATERIALIZED VIEW MV_Test
NOLOGGING
CACHE
BUILD IMMEDIATE
REFRESH FAST ON COMMIT
AS
SELECT V.* FROM TPM_PROJECTVERSION V;
Если я добавляю JOIN, он прерывается:
CREATE MATERIALIZED VIEW MV_Test
NOLOGGING
CACHE
BUILD IMMEDIATE
REFRESH FAST ON COMMIT
AS
SELECT V.*, P.* FROM TPM_PROJECTVERSION V
INNER JOIN TPM_PROJECT P ON P.PROJECTID = V.PROJECTID
Теперь я получаю сообщение об ошибке:
ORA-12054: не может установить атрибут обновления ON COMMIT для материализованного представления
Я создал материализованные журналы просмотра как на TPM_PROJECT, так и на TPM_PROJECTVERSION. TPM_PROJECT имеет первичный ключ PROJECTID, а TPM_PROJECTVERSION имеет составной первичный ключ (PROJECTID, VERSIONID). Что за трюк? Я копался в руководствах Oracle безрезультатно. Спасибо!
Ответы
Ответ 1
Для начала из Руководство по хранилищу данных Oracle Database:
Ограничения при быстром обновлении на материализованных представлениях только с единственными
...
- Rowids всех таблиц в списке FROM должен появиться в SELECT список запроса.
Это означает, что ваше утверждение должно выглядеть примерно так:
CREATE MATERIALIZED VIEW MV_Test
NOLOGGING
CACHE
BUILD IMMEDIATE
REFRESH FAST ON COMMIT
AS
SELECT V.*, P.*, V.ROWID as V_ROWID, P.ROWID as P_ROWID
FROM TPM_PROJECTVERSION V,
TPM_PROJECT P
WHERE P.PROJECTID = V.PROJECTID
Еще один важный аспект заключается в том, что ваши материализованные журналы просмотров должны быть созданы как with rowid
.
Ниже приведен сценарий функционального тестирования:
CREATE TABLE foo(foo NUMBER, CONSTRAINT foo_pk PRIMARY KEY(foo));
CREATE MATERIALIZED VIEW LOG ON foo WITH ROWID;
CREATE TABLE bar(foo NUMBER, bar NUMBER, CONSTRAINT bar_pk PRIMARY KEY(foo, bar));
CREATE MATERIALIZED VIEW LOG ON bar WITH ROWID;
CREATE MATERIALIZED VIEW foo_bar
NOLOGGING
CACHE
BUILD IMMEDIATE
REFRESH FAST ON COMMIT AS SELECT foo.foo,
bar.bar,
foo.ROWID AS foo_rowid,
bar.ROWID AS bar_rowid
FROM foo, bar
WHERE foo.foo = bar.foo;
Ответ 2
Вы пробовали это без присоединения ANSI?
CREATE MATERIALIZED VIEW MV_Test
NOLOGGING
CACHE
BUILD IMMEDIATE
REFRESH FAST ON COMMIT
AS
SELECT V.*, P.* FROM TPM_PROJECTVERSION V,TPM_PROJECT P
WHERE P.PROJECTID = V.PROJECTID
Ответ 3
Вы получите сообщение об ошибке REFRESH_FAST, если вы не создадите материализованные журналы просмотра для главной таблицы (ов), на которую ссылается запрос. Если кто-то не знаком с материализованными представлениями или использует его в первый раз, лучший способ - использовать oracle sqldeveloper и графически помещать в опции, а ошибки также обеспечивают гораздо лучший смысл.
Ответ 4
Ключ проверки FAST REFRESH включает в себя следующее:
1) An Oracle materialized view log must be present for each base table.
2) The RowIDs of all the base tables must appear in the SELECT list of the MVIEW query definition.
3) If there are outer joins, unique constraints must be placed on the join columns of the inner table.
Нет 3 легко пропустить и стоит выделить здесь