我刚刚创建了表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,但完全刷新会更新 . (注: But the Mview is still 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--
-
REWRITE --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
How can I achieve Fast Refresh On Commit ?
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 生产环境
2 回答
我不知道问题是否仍然存在,但是当我看到你提供的artice时,我注意到了一些东西(这可能就是解决方案):
ON COMMIT Refresh
可以使用ON COMMIT方法自动刷新实例化视图 . 因此,每当事务提交更新了已定义实例化视图的表时,这些更改将自动反映在实例化视图中 . 使用此方法的优点是您永远不必记住刷新物化视图 . The only disadvantage is the time required to complete the commit will be slightly longer because of the extra processing involved. 但是,在数据仓库中,这应该不是问题,因为不可能有并发进程尝试更新同一个表 .
然后我们有:
Table 7-1 ON DEMAND Refresh Methods
刷新选项参数描述物化视图的 COMPLETE C Refreshes by recalculating the defining query .
FAST F Refreshes by incrementally applying changes to the materialized view . 对于本地物化视图,它选择优化器估计的最有效的刷新方法 . 考虑的刷新方法是基于日志的FAST和FAST_PCT .
FAST_PCT P通过重新计算详细信息表中受更改的分区影响的实例化视图中的行进行刷新 .
FORCE ?尝试快速刷新 . 如果那是不可能的,它会完全刷新 . 对于本地物化视图,它选择优化器估计的最有效的刷新方法 . 考虑的刷新方法是基于日志的FAST,FAST_PCT和COMPLETE .
注意粗线 .
我个人更喜欢FORCE选项 .
你能否告诉我,如果一段时间后再次发生这种情况(取决于数据库及其运行的机器的参数,我甚至不能暗示你有多少)?
When Fast Refresh is Possible
Not all materialized views may be fast refreshable. 因此,使用包DBMS_MVIEW.EXPLAIN_MVIEW确定可用于实例化视图的刷新方法 .
如果您不确定如何使物化视图快速刷新,则可以使用DBMS_ADVISOR.TUNE_MVIEW过程,该过程提供包含创建快速可刷新物化视图所需语句的脚本 .
干杯
我看到您使用ROWID创建了物化视图日志,这并不是真正需要的,因为两个表都有一个主键,因此您可以尝试不使用ROWID .
在emp上创建物化视图日志;在部门上创建物化视图日志;
此外,如果使用ROWID创建实例化视图日志,则应使用rowid创建实例化视图 .
创建物化视图empdept_mv刷新快速提交WITH ROWID作为选择a.rowid dept_rowid,b.rowid emp_rowid,a.dept_no,b.emp_no来自dept a,emp b其中a.dept_no = b.dept_no;
您可以尝试这些更改,看看物化视图是否在提交时快速刷新 .