问题描述
嗨,汤姆,
如何在物化视图中查找最近刷新的记录?
(此处使用“快速刷新”创建的实例化视图)
(注:假设我有100条记录的基表,然后我刷新了物化视图,现在我有所有100条记录在物化中使用不同的Rowid ,然后我再次向现有基表插入了20条新记录,现在,我正在从物化视图中查找最近添加的20条记录......告诉我那个查询?
如何在物化视图中查找最近刷新的记录?
(此处使用“快速刷新”创建的实例化视图)
(注:假设我有100条记录的基表,然后我刷新了物化视图,现在我有所有100条记录在物化中使用不同的Rowid ,然后我再次向现有基表插入了20条新记录,现在,我正在从物化视图中查找最近添加的20条记录......告诉我那个查询?
专家解答
我不知道有什么方法可以直接找到新行。
如果在刷新实体化视图日志之前查询该日志,您将看到将要发生的更改。刷新后,可以使用闪回查询来标识已更改的行。或者,您可以使用闪回查询来查看上次刷新MV日志之前的MV日志中的内容:
虽然如果您使用基于时间的闪回查询,由于数据的粒度,您可能会遗漏一些更改。
还要记住, MV通常用于聚合数据。因此,即使基表中有更多的行, MV本身也可能没有任何额外的行!
有关MV日志工作方式的更多详细信息,请查看:
http://www.adellera.it/blog/2009/11/03/11gr2-materialized-view-logs-changes/
如果在刷新实体化视图日志之前查询该日志,您将看到将要发生的更改。刷新后,可以使用闪回查询来标识已更改的行。或者,您可以使用闪回查询来查看上次刷新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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




