Подтвердить что ты не робот

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 безрезультатно. Спасибо!

4b9b3361

Ответ 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 легко пропустить и стоит выделить здесь