我使用ora_rowscn
跟踪表格中已更改的行并使用更新的行。
上周我注意到,对于我使用rowdependencies
创建的一些(不是全部)表格,ora_rowscn
更改了表格中没有任何交易。我的意思是,如果我选择max(ora_rowscn)
我会得到更高的数字。
以下是我创建表格的示例
创建表
create table test ( test_id number, txt varchar2(5) ) rowdependencies;
在表格中插入了一些数据
insert into test values(1,'a');
insert into test values(2,'b');
insert into test values(3,'c');
使用ORA_ROWSCN
多次查询表格select max(ora_rowscn),max(b.current_scn) from test a, v$database b
每当我查询时,我都会得到更高的max(ora_rowscn)
。
在MetaLink上我发现两个报告错误(错误14093863,错误9814923)似乎是同一个问题,但设置为不是错误。
为什么会发生这种情况,让它发挥作用或修复它的解决方案是什么?
答案 0 :(得分:2)
我们询问了我们的Oracle联系人并得到了以下答案。
“这不是一个错误,它的未记录的功能。”
块清除时会生成ORA_ROWSCN 交易。可能会出现两种块清理:快速 清理干净并延迟清理。
请注意,对于延迟清除,事务的确切commit-scn 当该事务修改的块为时,可能无法使用 清理出来,因此我们可能会获得commit-scn的上限。 因此,对于那些快速清理的块,我们可以更新ORA_ROWSCN 在交易提交后;
然而,对于延迟清理的那些块我们只更新了 下次我们触摸块时对应的ORA_ROWSCN(DML或 选择)。可能会在几个小时后。我们有可能 在其他表中做一堆工作人员(因此SCN会增加) 我们在这张表T中没有做任何交易。但是当我们这样做时 查询表T的ORA_ROWSCN,我们仍然可以获得最近的数字 对于SCN,因为块刚刚被清理掉(但是 交易已在几个小时前提交)。这个ORA_ROWSCN是 最后一笔交易的提交时间的上限。
看起来问题确实存在。如果我理解正确,对于这种情况没有简单的解决方案。
我希望有助于了解其他用户的问题。
在这里,我发现了一些关于块清除的更多不完整的信息
答案 1 :(得分:0)
怎么样:
select
max(a.test_id) KEEP (DENSE_RANK FIRST ORDER BY a.ora_rowscn desc),
max(a.txt) KEEP (DENSE_RANK FIRST ORDER BY a.ora_rowscn desc),
max(a.rowid) KEEP (DENSE_RANK FIRST ORDER BY a.ora_rowscn desc),
max(a.ora_rowscn)
from test a;
这应该标识正在改变的行。