Oracle - как создать материализованное представление с быстрым обновлением и соединениями

поэтому я уверен, что Oracle поддерживает это, поэтому я понятия не имею, что я делаю неправильно. Этот код работает:

CREATE MATERIALIZED VIEW MV_Test
  NOLOGGING
  CACHE
  BUILD IMMEDIATE 
  REFRESH FAST ON COMMIT 
  AS
    SELECT V.* FROM TPM_PROJECTVERSION V;

Если я добавляю соединение, оно ломается:

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 refresh для материализованного представления

Я создал материализованные журналы представлений как для TPM_PROJECT, так и для TPM_PROJECTVERSION. TPM_PROJECT имеет первичный ключ PROJECTID и TPM_PROJECTVERSION имеет составной первичный ключ (PROJECTID, VERSIONID). В чем тут фокус? Я копался в руководствах Oracle безрезультатно. Спасибо!

4 ответов


для начала, от Oracle Database Data Warehousing Guide:

ограничения на быстрое обновление материализованных представлений только с присоединениями

...

  • Rowids всех таблиц в списке от должны появиться в 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;

вы пробовали это без соединения 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

вы получите ошибку при REFRESH_FAST, если вы не создадите материализованные журналы представлений для главной таблицы(таблиц), на которую ссылается запрос. Если кто-то не знаком с материализованными представлениями или использует их в первый раз, лучший способ-использовать oracle sqldeveloper и графически вводить параметры, а ошибки также обеспечивают гораздо лучший смысл.


проверка ключа для быстрого обновления включает следующее:

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