Oracle 物化视图提交时的快速刷新
我刚刚创建了DEPT和EMP表,如下所示:Oracle 物化视图提交时的快速刷新,oracle,materialized-views,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))
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
我插入了一条新记录并提交了。。但是,当我检查物化视图时,新记录不会显示在物化视图中
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
现在,当我运行快速和完全刷新的过程时,快速刷新不会更新Mview,但完全刷新会更新Mview。注意:但是Mview在提交时仍然是刷新的
DBMS_MVIEW.EXPLAIN_MVIEW输出如图所示:capability_name-mable-msgtxt
PCT-N-
刷新_COMPLETE-Y-
刷新\u FAST-Y-
重写-N-
PCT_表-N-Oracle错误:有关详细信息,请参阅相关_数和相关_文本
细节
插入后刷新\u快速\u-Y-
在DML-Y之后刷新\u FAST\u-
在任何DML-Y之后刷新\u FAST\u-
刷新\u FAST\u PCT-N-PCT在任何细节上都是不可能的
主桌
重写全文匹配-N-Oracle错误:请参阅相关的
有关详细信息,请参阅相关文本
重写\u全文\u匹配-N-在上禁用查询重写
物化视图
重写\u部分\u文本\u匹配-N-物化视图无法支持
任何类型的查询重写
重写\u部分\u文本\u匹配-N-在上禁用查询重写
物化视图
REWRITE_GENERAL-N-物化视图不能支持任何类型的
查询重写
REWRITE_GENERAL-N-在物化数据库上禁用查询重写
看法
重写\u PCT-N-无法进行常规重写或PCT不可用
有可能
PCT_表_REWRITE-N-Oracle错误:请参阅相关的_NUM和
有关详细信息,请参阅相关文本
如何在提交时实现快速刷新?
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生产版我看到您使用ROWID创建了物化视图日志,这实际上不是必需的,因为两个表都有主键,因此您可以尝试不使用ROWID 在emp上创建物化视图日志; 在部门创建物化视图日志 此外,如果使用ROWID创建物化视图日志,则应使用ROWID创建物化视图 创建物化视图empdept_mv refresh fast on commit,ROWID为 选择a.rowid dept\u rowid、b.rowid emp\u rowid、a.dept\u no、b.emp\u no 来自a部门,emp b 其中a.dept\u no=b.dept\u no
您可以尝试这些更改,看看具体化视图是否在提交时快速刷新 我不知道问题是否仍然存在,但当我查看您提供的文章时,我注意到一些可能就是这里的解决方案: 提交刷新时 可以使用oncommit方法自动刷新物化视图。因此,每当事务提交并更新了定义了物化视图的表时,这些更改都会自动反映在物化视图中。使用这种方法的优点是,您不必记住刷新物化视图。唯一的缺点是,由于涉及额外的处理,完成提交所需的时间将稍长。但是,在数据仓库中,这不应该是一个问题,因为不太可能有并发进程尝试更新同一个表 请注意粗线条。 然后我们有: 表7-1按需刷新方法 刷新选项参数说明 COMPLETE C通过重新计算物化视图的定义查询进行刷新
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
FAST F通过增量地将更改应用于物化视图来刷新。对于局部物化视图,它选择由优化器估计为最有效的刷新方法。所考虑的刷新方法是基于日志的FAST和FAST\u PCT
FAST_PCT p通过重新计算物化视图中受细节表中更改分区影响的行来刷新
武力?尝试快速刷新。如果不可能,它将执行完全刷新。
对于局部物化视图,它选择由优化器估计为最有效的刷新方法。所考虑的刷新方法是基于日志的FAST、FAST\u PCT和COMPLETE
请注意粗体的线条。
我个人更喜欢武力选项。
你能告诉我,如果这种情况在一段时间后再次发生,取决于数据库的参数和它运行的机器,所以我甚至不能提示你多少
当可以快速刷新时
并非所有物化视图都可以快速刷新。因此,使用包DBMS_MVIEW.EXPLAIN_MVIEW来确定哪些刷新方法可用于物化视图
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
如果不确定如何使物化视图快速刷新,可以使用DBMS_ADVISOR.TUNE_MVIEW过程,该过程提供一个脚本,其中包含创建快速刷新主视图所需的语句
序列化视图
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
干杯这对我很有效。您可能需要添加创建物化视图日志。。。您没有显示任何数据,也没有说明将行插入到哪个表中。运行定义MV查询的select语句时,是否看到新行?我已经包含了所有insert语句。是的,我可以在表中插入后看到新行。