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

新手上路,请多包涵

所以我很确定甲骨文支持这一点,所以我不知道我做错了什么。此代码有效:

 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 手册,但无济于事。谢谢!

原文由 Mike Christensen 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答

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

仅使用连接的物化视图的快速刷新限制

  • 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;

原文由 Allan 发布,翻译遵循 CC BY-SA 3.0 许可协议

您是否在没有 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

原文由 steve godfrey 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进