如何创建不更新旧数据的增量视图?
Posted
技术标签:
【中文标题】如何创建不更新旧数据的增量视图?【英文标题】:How to create an incremental view where old data is not updated? 【发布时间】:2021-07-02 01:52:40 【问题描述】:是否可以创建仅增量的物化视图?
我希望不更新已插入的旧数据,视图中应仅包含新插入的数据。
如果可能,我该怎么做?
是否有任何文档或任何地方可以用作指南?
【问题讨论】:
您必须以仅从表中选择新行的方式编写 MV 查询。您可以利用带有主键的物化视图日志的内容来做到这一点。 您想查看插入时存在的每一行,还是仅新行添加自上次刷新以来? ORACLE 的哪个版本? 我认为您不会得到比 Chris 的答案更有声望的答案。看到他的评论我立刻认出了他的名字,而且他的回答很详细。 What should I do when someone answers my question? 【参考方案1】:如果您想在插入 MV 时查看每一行,简短的回答是:
你不能。
materialized view
存储查询的结果,因为它存在现在,而不是过去某个时间。因此,在更新一行后,您可以查看其当前值或将其从 MV 中排除。
如果您想在插入时保留/查看数据状态,您有几个选择:
使表只插入(可能在表中存储更改历史记录) 在将数据添加(例如通过触发器)到另一个表时捕获数据 使用Flashback Data Archive 存储更改历史记录并使用Flashback Query 查看哪一个最合适取决于您为什么需要在插入时查看数据。
从技术上讲,可以在插入时查看数据 - 直到某个点。
使用闪回版本查询,您可以查看表随时间的变化。所以你可以这样做:
create table t (
c1 int, c2 int,
insert_date timestamp,
update_date timestamp
);
exec dbms_session.sleep(10);
insert into t values ( 1, 1, systimestamp, systimestamp );
insert into t values ( 2, 2, systimestamp, systimestamp );
commit;
create materialized view mv
as
select t.*
from t
versions between scn minvalue
and maxvalue
where versions_operation = 'I';
exec dbms_session.sleep(10);
update t
set c2 = 9999,
update_date = systimestamp
where c1 = 2;
insert into t values ( 3, 3, systimestamp, systimestamp );
commit;
exec dbms_mview.refresh ( 'mv' );
select * from t;
C1 C2 INSERT_DATE UPDATE_DATE
1 1 26-JUL-2021 13.49.51.666954000 26-JUL-2021 13.49.51.666954000
2 9999 26-JUL-2021 13.49.51.712259000 26-JUL-2021 13.50.08.421872000
3 3 26-JUL-2021 13.50.08.462300000 26-JUL-2021 13.50.08.462300000
select *
from mv;
C1 C2 INSERT_DATE UPDATE_DATE
3 3 26-JUL-2021 13.50.08.462300000 26-JUL-2021 13.50.08.462300000
2 2 26-JUL-2021 13.49.51.712259000 26-JUL-2021 13.49.51.712259000
1 1 26-JUL-2021 13.49.51.666954000 26-JUL-2021 13.49.51.666954000
这使用撤消来重建历史。最终,较旧的更改将消失,您将回到只看到当前状态。默认情况下,您只能获得 15 分钟 的更改!
如果您想长期存储历史记录,闪回数据存档是您的最佳选择。
【讨论】:
以上是关于如何创建不更新旧数据的增量视图?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Oracle 中的视图上使用 AUTO_INCREMENT 创建 id
Postgres 物化视图或 CREATE TABLE AS 如果不增量更新?