Oracle - Как создать материализованное представление с помощью FAST REFRESH и JOINS - PullRequest
35 голосов
/ 21 сентября 2011

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

Ответы [ 4 ]

45 голосов
/ 21 сентября 2011

Для начала, из Руководства по хранилищу данных Oracle Database :

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

...

  • В списке SELECT запроса должны отображаться строки всех таблиц в списке FROM.

Это означает, что ваш операторбудет выглядеть примерно так:

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.

Ниже приведен сценарий функционального тестирования:1023 *

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;
5 голосов
/ 21 сентября 2011

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

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

1 голос
/ 18 октября 2016

Проверка ключа для 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 легко пропустить и его стоит выделить

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...