我最近了解到oracle有一个对我来说非常有用的功能 - 因为设计人员/实现者并不关心数据历史 - 我可以查询记录的历史状态,如果它在oracle缓存中可用,像这样:
select *
from ( select *
from sometable where some_condition )
as of timestamp sysdate-1
但现在我需要检查范围内的历史数据。无论如何,使用缓存是否可能?
答案 0 :(得分: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参数的限制,通常是几小时而不是几天。
答案 1 :(得分:2)
需要注意的一点是,这种闪回查询依赖于写入UNDO表空间的UNDO信息。并且这些信息不会永久保留 - 大多数合理负载的生产系统都不会有24小时的UNDO信息。
根据Oracle版本的不同,您可能需要将UNDO_RETENTION
参数设置为比您尝试闪回的时间段更长的值。
答案 2 :(得分:0)
SELECT *
FROM sometable
VERSIONS BETWEEN TIMESTAMP systimestamp - 1 AND systimestamp
将在最后一天为您提供所有行的所有版本。
你可以做更多的事情。查看documentation(您可能希望找到适合您版本的文档)。