【问题标题】:Fast Refresh on commit of materialized view提交物化视图时快速刷新
【发布时间】: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)

  1. PCT --N--
  2. REFRESH_COMPLETE --Y--
  3. REFRESH_FAST --Y--
  4. 重写--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 了解详情

如何实现提交时快速刷新?
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 语句时是否看到新行?
  • 我已经包含了所有的插入语句。是的,我可以在表格中插入后看到新行。

标签: oracle materialized-views


【解决方案1】:

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

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

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

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

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

【讨论】:

    【解决方案2】:

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

    ON COMMIT 刷新

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

    • 注意粗线。

    那么我们有:

    表 7-1 ON DEMAND 刷新方法

    刷新选项参数说明 COMPLETE C 通过重新计算物化视图的定义查询来刷新

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

    FAST_PCT P 通过重新计算物化视图中受明细表中更改的分区影响的行来刷新。

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

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

    您能否告诉我,这种情况是否会在一段时间后再次发生(取决于数据库的参数和它运行的机器,所以我什至无法提示您多少)?

    何时可以快速刷新

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

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

    干杯

    【讨论】:

      猜你喜欢
      • 2011-07-09
      • 2013-12-04
      • 1970-01-01
      • 2010-12-22
      • 2020-03-13
      • 2016-12-11
      • 2018-09-04
      • 1970-01-01
      • 2015-06-13
      相关资源
      最近更新 更多