Oracle - 如何使用FAST REFRESH和JOINS创建物化视图

Mik*_*sen 35 sql database oracle oracle11g

所以我很确定Oracle支持这个,所以我不知道我做错了什么.此代码有效:

CREATE MATERIALIZED VIEW MV_Test
  NOLOGGING
  CACHE
  BUILD IMMEDIATE 
  REFRESH FAST ON COMMIT 
  AS
    SELECT V.* FROM TPM_PROJECTVERSION V;
Run Code Online (Sandbox Code Playgroud)

如果我添加一个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
Run Code Online (Sandbox Code Playgroud)

现在我收到错误:

ORA-12054:无法为实例化视图设置ON COMMIT刷新属性

我在TPM_PROJECT和TPM_PROJECTVERSION上创建了物化视图日志.TPM_PROJECT的主键为PROJECTID,TPM_PROJECTVERSION的复合主键为(PROJECTID,VERSIONID).有什么诀窍呢?我一直在挖掘Oracle手册无济于事.谢谢!

All*_*lan 45

首先,从Oracle数据库数据仓库指南:

仅具有连接的物化视图上的快速刷新限制

...

  • FROM列表中所有表的Rowid必须出现在查询的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
Run Code Online (Sandbox Code Playgroud)

另一个需要注意的关键方面是必须将您的物化视图日志创建为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;
Run Code Online (Sandbox Code Playgroud)

  • Uggghhhh圣洁的废话谢谢你!最终有效.实际上,我并没有真正理解Oracle中的物化视图.它们仅限于对任何人都没有用的地方.我想知道MS SQL中的索引视图是否更好. (2认同)
  • MS SQL 中的索引视图有所不同 - 它们总是立即更新,但有一些相当严格的限制,例如没有子查询、没有外部联接、没有嵌套索引视图、没有非确定性函数等。请参阅 https:// learn.microsoft.com/en-us/sql/relational-databases/views/create-indexed-views (2认同)

ste*_*rey 5

你有没有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
Run Code Online (Sandbox Code Playgroud)