【发布时间】:2013-12-04 20:57:57
【问题描述】:
我刚刚创建了 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);
我使用 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
我插入了一条新记录并执行了 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
现在,当我以per 运行快速和完全刷新过程时,快速刷新不会更新 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
DBMS_MVIEW.EXPLAIN_MVIEW 输出如图所示:(capability_name --Possible-- msgtxt)
- PCT --N--
- REFRESH_COMPLETE --Y--
- REFRESH_FAST --Y--
- 重写--N--
- PCT_TABLE --N-- Oracle 错误:请参阅 RELATED_NUM 和 RELATED_TEXT 详情
- REFRESH_FAST_AFTER_INSERT --Y--
- REFRESH_FAST_AFTER_ONETAB_DML --Y--
- REFRESH_FAST_AFTER_ANY_DML --Y--
- REFRESH_FAST_PCT --N-- PCT 在任何细节上都是不可能的 主表
- REWRITE_FULL_TEXT_MATCH --N-- Oracle 错误:请参阅 RELATED_NUM 和 RELATED_TEXT 了解详情
- REWRITE_FULL_TEXT_MATCH --N-- 查询重写在 物化视图
- REWRITE_PARTIAL_TEXT_MATCH --N-- 物化视图不支持 任何类型的查询重写
- REWRITE_PARTIAL_TEXT_MATCH --N-- 查询重写在 物化视图
- REWRITE_GENERAL --N-- 物化视图不支持任何类型的 查询重写
- REWRITE_GENERAL --N-- 在物化对象上禁用查询重写 查看
- REWRITE_PCT --N-- 一般重写是不可能的或 PCT 不是 可能在一个
- 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 生产
适用于 Linux 的 TNS:10.2.0.4.0 生产版
【问题讨论】:
-
它对我有用。您可能需要添加您的
create materialized view log...和插入内容,以便我们可以完全重现该问题。 -
您没有显示任何数据,也没有说明您将行插入到哪个表中。运行定义 MV 查询的 select 语句时是否看到新行?
-
我已经包含了所有的插入语句。是的,我可以在表格中插入后看到新行。