提交物化视图时快速刷新

时间:2013-11-20 17:48:20

标签: 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);

我使用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)

  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了解详情
  18. 如何在提交时实现快速刷新?
    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 个答案:

答案 0 :(得分:2)

我不知道问题是否仍然存在,但是当我看到你提供的artice时,我注意到了一些东西(这可能只是解决方案):

ON COMMIT刷新

可以使用ON COMMIT方法自动刷新实例化视图。因此,每当事务提交更新了定义了物化视图的表时,这些更改将自动反映在物化视图中。使用此方法的优点是您永远不必记住刷新物化视图。 唯一的缺点是,由于涉及额外的处理,完成提交所需的时间会稍长。但是,在数据仓库中,这应该不是问题,因为不太可能存在并发进程试图更新同一张桌子。

  • 注意粗线。

然后我们有:

表7-1 ON DEMAND刷新方法

刷新选项参数说明 完成 C 通过重新计算实体化视图的定义查询进行刷新。

FAST F 通过逐步将更改应用于实体化视图来刷新。对于本地物化视图,它选择优化器估计的最有效的刷新方法。考虑的刷新方法是基于日志的FAST和FAST_PCT。

FAST_PCT P通过重新计算详细信息表中受更改分区影响的实体化视图中的行进行刷新。

FORCE ?尝试快速刷新。如果那是不可能的,它会完全刷新。 对于本地物化视图,它选择优化器估计的最有效的刷新方法。考虑的刷新方法是基于日志的FAST,FAST_PCT和COMPLETE。

  • 注意粗线。
  • 我个人更喜欢FORCE选项。

请问,如果在一段时间后再次出现这种情况(取决于数据库及其运行的机器的参数,那么我甚至不能暗示你有多少)?

可以快速刷新

并非所有物化视图都可以快速刷新。因此,请使用包 DBMS_MVIEW.EXPLAIN_MVIEW 来确定物化视图可用的刷新方法。

如果您不确定如何使物化视图快速刷新,则可以使用 DBMS_ADVISOR.TUNE_MVIEW 过程,该过程提供包含创建快速可刷新物化视图所需语句的脚本。 / p>

干杯

答案 1 :(得分:1)

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

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

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

在提交WITH ROWID时快速创建物化视图empdept_mv刷新 选择a.rowid dept_rowid,b.rowid emp_rowid,a.dept_no,b.emp_no 来自dept a,emp b 其中a.dept_no = b.dept_no;

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