提交物化视图时快速刷新

Dee*_*nga 10 oracle materialized-views

我刚刚创建了表DEPT和EMP,如下所示:

create table DEPT
( dept_no number , dept_name varchar(32) , dept_desc varchar(32),
  CONSTRAINT dept_pk Primary Key (dept_no) );

create table EMP
( emp_no number, dept_no number, CONSTRAINT emp_pk Primary Key (emp_no,dept_no));

insert into dept values (10,'it','desc1');
insert into dept values (20,'hr','desc2');

insert into emp values (1,10);
insert into emp values (2,20);
Run Code Online (Sandbox Code Playgroud)

我使用rowid和物化视图在这些表上创建了物化视图日志,如下所示:

create materialized view log on emp with rowid;
create materialized view log on dept with rowid;

create materialized view empdept_mv refresh fast on commit as
select a.rowid dept_rowid, b.rowid emp_rowid, a.dept_no,b.emp_no
from dept a, emp b
where a.dept_no=b.dept_no ;

select * from emp;
    EMP_NO    DEPT_NO
  ---------- ----------
     1         10
     2         20
     3         30

select * from dept;
   DEPT_NO DEPT_NAME                        DEPT_DESC
---------- -------------------------------- --------------------------------
    10 it                               desc1
    20 hr                               desc2
    30 it                               desc3

select * from empdept_mv;

DEPT_ROWID         EMP_ROWID             DEPT_NO     EMP_NO
------------------ ------------------ ---------- ----------
AAAli5AABAAAPZ6AAA AAAli7AABAAAQs6AAA         10          1
AAAli5AABAAAPZ6AAB AAAli7AABAAAQs6AAB         20          2
Run Code Online (Sandbox Code Playgroud)

我插入了一条新记录并执行了COMMIT; ..但是当我检查物化视图时,新记录不会显示在物化视图中.

insert into dept values (30,'it','desc3');
commit;
insert into emp values (3,30);
commit;

select * from empdept_mv;

DEPT_ROWID         EMP_ROWID             DEPT_NO     EMP_NO
------------------ ------------------ ---------- ----------
AAAli5AABAAAPZ6AAA AAAli7AABAAAQs6AAA         10          1
AAAli5AABAAAPZ6AAB AAAli7AABAAAQs6AAB         20          2
Run Code Online (Sandbox Code Playgroud)

现在,当我运行快速,彻底刷新的过程,快速刷新不更新MView的,但完全刷新呢.(注意:但是Mview仍然是REFRESH ON COMMIT)

execute DBMS_MVIEW.REFRESH('empdept_mv', 'F', '', TRUE, FALSE, 0,0,0,FALSE, FALSE);
PL/SQL procedure successfully completed.

DEPT_ROWID         EMP_ROWID             DEPT_NO     EMP_NO
------------------ ------------------ ---------- ----------
AAAli5AABAAAPZ6AAA AAAli7AABAAAQs6AAA         10          1
AAAli5AABAAAPZ6AAB AAAli7AABAAAQs6AAB         20          2


execute DBMS_MVIEW.REFRESH('test_mview2', 'C', '', TRUE, FALSE, 0,0,0,FALSE, FALSE);
PL/SQL procedure successfully completed.

DEPT_ROWID         EMP_ROWID             DEPT_NO     EMP_NO
------------------ ------------------ ---------- ----------
AAAli5AABAAAPZ6AAA AAAli7AABAAAQs6AAA         10          1
AAAli5AABAAAPZ6AAB AAAli7AABAAAQs6AAB         20          2
AAAli5AABAAAPZ6AAC AAAli7AABAAAQs6AAC         30          3
Run Code Online (Sandbox Code Playgroud)

DBMS_MVIEW.EXPLAIN_MVIEW输出如下所示:(capability_name --Possible-- msgtxt)

  1. PCT - N--
  2. REFRESH_COMPLETE --Y--
  3. REFRESH_FAST --Y--
  4. REWRITE --N--
  5. PCT_TABLE - N-- Oracle错误:有关详细信息,请参阅RELATED_NUM和RELATED_TEXT
  6. REFRESH_FAST_AFTER_INSERT --Y--
  7. REFRESH_FAST_AFTER_ONETAB_DML --Y--
  8. REFRESH_FAST_AFTER_ANY_DML --Y--
  9. REFRESH_FAST_PCT - N-- PCT在主机的任何详细信息表中都不可用
  10. REWRITE_FULL_TEXT_MATCH --N-- Oracle错误:有关详细信息,请参阅RELATED_NUM和RELATED_TEXT
  11. REWRITE_FULL_TEXT_MATCH --N--在物化视图上禁用查询重写
  12. REWRITE_PARTIAL_TEXT_MATCH - N--物化视图不支持任何类型的查询重写
  13. REWRITE_PARTIAL_TEXT_MATCH --N--在物化视图上禁用查询重写
  14. REWRITE_GENERAL - N--物化视图不支持任何类型的查询重写
  15. REWRITE_GENERAL - N--在物化视图上禁用查询重写
  16. REWRITE_PCT --N--一般重写是不可能的,或者PCT是不可能的
  17. PCT_TABLE_REWRITE - N-- Oracle错误:有关详细信息,请参阅RELATED_NUM和RELATED_TEXT

如何实现快速刷新提交?
Oracle版本详细信息如下:
NLSRTL 10.2.0.4.0生产
Oracle数据库10g 10.2.0.4.0 64位生产
PL/SQL 10.2.0.4.0生产
TNS for Linux:10.2.0.4.0生产

小智 1

我看到您使用 ROWID 创建了物化视图日志,这实际上并不是必需的,因为两个表都有主键,因此您可以尝试不使用 ROWID。

在 emp 上创建物化视图日志;在部门创建物化视图日志;

此外,如果您使用 ROWID 创建物化视图日志,则应该使用 rowid 创建物化视图。

创建物化视图 empdept_mv 在提交时快速刷新WITH ROWID as select a.rowid dept_rowid, b.rowid emp_rowid, a.dept_no,b.emp_no from dept a, emp b where a.dept_no=b.dept_no ;

您可以尝试这些更改,看看物化视图在提交时是否快速刷新。