如何创建不更新旧数据的增量视图?

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 分钟 的更改!

如果您想长期存储历史记录,闪回数据存档是您的最佳选择。

【讨论】:

以上是关于如何创建不更新旧数据的增量视图?的主要内容,如果未能解决你的问题,请参考以下文章

用增量数字填充字段需要啥 MySQL 语句

如何在 Oracle 中的视图上使用 AUTO_INCREMENT 创建 id

Core Data 在更新旧对象时创建一个新对象

Postgres 物化视图或 CREATE TABLE AS 如果不增量更新?

SQL Server,如何在不丢失数据的情况下创建表后设置自动增量?

Json文件更新但不读取旧文件?