3

我最近了解到 oracle 有一个对我非常有用的特性——因为设计者/实现者不太关心数据历史——我可以查询记录的历史状态(如果它在 oracle 缓存中可用),如下所示:

select * 
  from ( select * 
           from sometable where some_condition ) 
as of timestamp sysdate-1 

但是现在我需要检查一个范围内的历史数据。无论如何,使用缓存有可能吗?

4

3 回答 3

8

是的,像这样:

SQL> select sal from emp where empno=7369;

       SAL
----------
      5800

SQL> update emp set sal = sal+100 where empno=7369;

1 row updated.

SQL> commit;

Commit complete.

SQL> update emp set sal = sal-100 where empno=7369;

1 row updated.      

SQL> commit;

Commit complete.

SQL> select empno, sal, versions_starttime,versions_xid
  2  from emp
  3  versions between timestamp sysdate-1 and sysdate
  4  where empno=7369;

     EMPNO        SAL VERSIONS_STARTTIME                                                          VERSIONS_XID
---------- ---------- --------------------------------------------------------------------------- --
      7369       5900 11-DEC-08 16.05.32                                                          0014001300002A74
      7369       5800 11-DEC-08 16.03.32                                                          000D002200012EB1
      7369       5800

请注意,您可以返回多远受 UNDO_RETENTION 参数的限制,通常是几小时而不是几天。

于 2008-12-11T15:53:54.317 回答
2

需要注意的一点是,这种闪回查询依赖于写入 UNDO 表空间的 UNDO 信息。而且这些信息不会永远保留——大多数处于合理负载下的生产系统不会有 24 小时的 UNDO 信息可用。

根据 Oracle 版本,您可能需要将该UNDO_RETENTION参数设置为比您尝试闪回的时间段更长的值。

于 2008-12-11T16:59:44.217 回答
0
SELECT *
  FROM sometable
  VERSIONS BETWEEN TIMESTAMP systimestamp - 1 AND systimestamp

将为您提供最后一天所有行的所有版本。

你可以用这个做更多的事情。查看文档(您可能希望找到适合您的版本的文档)。

于 2008-12-11T15:51:41.793 回答