Sql Oracle-如何创建具有快速刷新和连接的物化视图

Sql Oracle-如何创建具有快速刷新和连接的物化视图,sql,database,oracle,oracle11g,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; 如果我添加联接,它将断开: CREATE MATERIALIZED VIEW MV_Test NOLOGGING CACH

所以我很确定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:无法为物化视图设置提交时刷新属性


我已经在TPM_项目和TPM_项目版本上创建了物化视图日志。TPM_PROJECT的主键为PROJECTID,TPM_PROJECTVERSION的复合主键为(PROJECTID,VERSIONID)。这有什么诀窍?我一直在翻阅甲骨文的手册,但一无所获。谢谢

您在没有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
首先,从以下内容开始:

对仅包含连接的物化视图快速刷新的限制

  • “发件人”列表中所有表的rowid必须显示在“选择”列表中 查询的列表
这意味着您的声明需要如下所示:

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
另一个需要注意的关键方面是,物化视图日志必须使用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;

如果不为查询所引用的主表创建物化视图日志,则在快速刷新时会出现错误。如果有人不熟悉物化视图或第一次使用物化视图,更好的方法是使用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号很容易错过,值得在这里强调一下

Hmm这似乎神奇地更有效。但是,现在我得到一个关于刷新速度的错误。如果我将其更改为“刷新完成”,它将创建视图。如果每次更新任何基础表时都必须手动运行整个查询,那么这可能会导致一些非常缓慢的更新。我认为只要每个表都有物化视图日志,就允许快速刷新。事实上,不久前我在Oracle创建了一个案例。Oracle认为这只是“缺少文档”,而不是一个bug!因此,旧的Oracle连接语法仍然是必需的。您是否尝试过
DBMS\u MVIEW.EXPLAIN\u MVIEW
?它应该显示视图的可用选项?我要做的第一件事是在select子句中丢失*。不确定视图将如何处理重复的列名是的,我一直在试图弄清楚如何运行DBMS\u MVIEW.EXPLAIN\u MVIEW,但还没有让它工作-抱歉,我对Oracle非常陌生。UGGGHH天哪,谢谢!这终于奏效了。实际上,我并不真正理解Oracle中的物化视图。它们被限制到对任何人都没有实际用处的程度。我想知道MS SQL中的索引视图是否更好。MS SQL中的索引视图是不同的-它们总是立即更新,但存在一些非常严重的限制,如没有子查询、没有外部联接、没有嵌套索引视图、没有非确定性函数等。请看我刚刚登录以感谢您!