Oracle:使用预构建表时不会刷新物化视图

时间:2016-11-20 10:42:13

标签: sql oracle oracle12c materialized-views

在Oracle 12的MV中使用Prebuilt Table选项时遇到问题。这段代码运行正常:

CREATE TABLE empt 
  ( ename VARCHAR2(20),
    empno INTEGER PRIMARY KEY);

CREATE MATERIALIZED VIEW LOG ON empt
   WITH SEQUENCE , rowid (empno)
 INCLUDING NEW VALUES;

CREATE MATERIALIZED VIEW empt_MV
    REFRESH FAST ON COMMIT 
    WITH ROWID
     AS
     SELECT count(*) numberofemps
     FROM empt ;

INSERT INTO empt VALUES ('A',1);
COMMIT;

SELECT * FROM empt_MV;

上一页选择返回,按预期方式:

NUMBEROFEMPS
------------
           1

但是,如果我使用ON PREBUILT TABLE选项,则没有任何反应。我的意思是,MV仍然是空的:

drop materialized view empt_mv;
drop materialized view log on empt;
drop table empt;

CREATE TABLE empt 
  ( ename VARCHAR2(20),
    empno INTEGER PRIMARY KEY);

CREATE MATERIALIZED VIEW LOG ON empt
   WITH SEQUENCE , rowid (empno)
 INCLUDING NEW VALUES;

CREATE TABLE empt_MV (
  numberofemps NUMBER);

CREATE MATERIALIZED VIEW empt_MV
    ON PREBUILT TABLE
    REFRESH FAST ON COMMIT 
    WITH ROWID
     AS
     SELECT count(*) numberofemps
     FROM empt ;

INSERT INTO empt VALUES ('A',1);
COMMIT;

SELECT * FROM empt_MV;

上一个选择返回没有行。

任何人都知道会发生什么?

2 个答案:

答案 0 :(得分:0)

如果您在预建表上使用REFRESH FAST,则无法使用WITH ROWIDWITH ROWID Clause

答案 1 :(得分:0)

这取决于Oracle版本。

使用相关文档中提供的说明,该文档将向您展示如何使用DBMS_MView.Explain_MView确定特定情况下的快速刷新功能。

12.1:https://docs.oracle.com/database/121/REPLN/repmview.htm#REPLN304