Oracle 物化视图提交时的快速刷新

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))

我刚刚创建了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
我插入了一条新记录并提交了。。但是,当我检查物化视图时,新记录不会显示在物化视图中

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语句。是的,我可以在表中插入后看到新行。