暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 在实体化视图中查找最近刷新的记录

askTom 2016-06-02
181

问题描述

嗨,汤姆,

如何在物化视图中查找最近刷新的记录?
(此处使用“快速刷新”创建的实例化视图)

(注:假设我有100条记录的基表,然后我刷新了物化视图,现在我有所有100条记录在物化中使用不同的Rowid ,然后我再次向现有基表插入了20条新记录,现在,我正在从物化视图中查找最近添加的20条记录......告诉我那个查询?

专家解答

我不知道有什么方法可以直接找到新行。

如果在刷新实体化视图日志之前查询该日志,您将看到将要发生的更改。刷新后,可以使用闪回查询来标识已更改的行。或者,您可以使用闪回查询来查看上次刷新MV日志之前的MV日志中的内容:

SQL> create table t (
  2    x int primary key
  3  );

Table created.

SQL>
SQL> insert into t
  2    select rownum from dual connect by level <= 100;

100 rows created.

SQL>
SQL> commit;

Commit complete.

SQL>
SQL> create materialized view log on t with primary key;

Materialized view log created.

SQL> create materialized view mv
  2  refresh fast on demand as
  3    select * from t;

Materialized view created.

SQL>
SQL> exec dbms_mview.refresh('MV', 'F');

PL/SQL procedure successfully completed.

SQL>
SQL> insert into t
  2    select rownum+100 from dual connect by level <= 20;

20 rows created.

SQL>
SQL> commit;

Commit complete.

SQL>
SQL> select * from MLOG$_T;

         X SNAPTIME$ D O CHANGE_VEC      XID$$
---------- --------- - - ---------- ----------
       101 01-JAN-00 I N FE         8.4447E+14
       102 01-JAN-00 I N FE         8.4447E+14
       103 01-JAN-00 I N FE         8.4447E+14
       104 01-JAN-00 I N FE         8.4447E+14
       105 01-JAN-00 I N FE         8.4447E+14
       106 01-JAN-00 I N FE         8.4447E+14
       107 01-JAN-00 I N FE         8.4447E+14
       108 01-JAN-00 I N FE         8.4447E+14
       109 01-JAN-00 I N FE         8.4447E+14
       110 01-JAN-00 I N FE         8.4447E+14
       111 01-JAN-00 I N FE         8.4447E+14
       112 01-JAN-00 I N FE         8.4447E+14
       113 01-JAN-00 I N FE         8.4447E+14
       114 01-JAN-00 I N FE         8.4447E+14
       115 01-JAN-00 I N FE         8.4447E+14
       116 01-JAN-00 I N FE         8.4447E+14
       117 01-JAN-00 I N FE         8.4447E+14
       118 01-JAN-00 I N FE         8.4447E+14
       119 01-JAN-00 I N FE         8.4447E+14
       120 01-JAN-00 I N FE         8.4447E+14

20 rows selected.

SQL> exec dbms_lock.sleep(5);

PL/SQL procedure successfully completed.

SQL>
SQL> exec dbms_mview.refresh('MV', 'F');

PL/SQL procedure successfully completed.

SQL>
SQL> select * from mv
  2  minus
  3  select * from mv as of timestamp sysdate - interval '2' second;

         X
----------
       101
       102
       103
       104
       105
       106
       107
       108
       109
       110
       111
       112
       113
       114
       115
       116
       117
       118
       119
       120

20 rows selected.

SQL>
SQL> select mview_name,
  2         to_char(last_refresh_date, 'dd-mon-yyyy hh24:mi:ss')
  3  from   user_mviews;

MVIEW_NAME                     TO_CHAR(LAST_REFRESH_DATE,'DD
------------------------------ -----------------------------
MV                             02-jun-2016 13:18:55

SQL> select * from MLOG$_T as of timestamp
  2    to_date('02-jun-2016 13:18:54', 'dd-mon-yyyy hh24:mi:ss') ;

         X SNAPTIME$ D O CHANGE_VEC      XID$$
---------- --------- - - ---------- ----------
       101 01-JAN-00 I N FE         8.4447E+14
       102 01-JAN-00 I N FE         8.4447E+14
       103 01-JAN-00 I N FE         8.4447E+14
       104 01-JAN-00 I N FE         8.4447E+14
       105 01-JAN-00 I N FE         8.4447E+14
       106 01-JAN-00 I N FE         8.4447E+14
       107 01-JAN-00 I N FE         8.4447E+14
       108 01-JAN-00 I N FE         8.4447E+14
       109 01-JAN-00 I N FE         8.4447E+14
       110 01-JAN-00 I N FE         8.4447E+14
       111 01-JAN-00 I N FE         8.4447E+14
       112 01-JAN-00 I N FE         8.4447E+14
       113 01-JAN-00 I N FE         8.4447E+14
       114 01-JAN-00 I N FE         8.4447E+14
       115 01-JAN-00 I N FE         8.4447E+14
       116 01-JAN-00 I N FE         8.4447E+14
       117 01-JAN-00 I N FE         8.4447E+14
       118 01-JAN-00 I N FE         8.4447E+14
       119 01-JAN-00 I N FE         8.4447E+14
       120 01-JAN-00 I N FE         8.4447E+14

20 rows selected.


虽然如果您使用基于时间的闪回查询,由于数据的粒度,您可能会遗漏一些更改。

还要记住, MV通常用于聚合数据。因此,即使基表中有更多的行, MV本身也可能没有任何额外的行!

有关MV日志工作方式的更多详细信息,请查看:

http://www.adellera.it/blog/2009/11/03/11gr2-materialized-view-logs-changes/
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论