为什么ora_rowscn在不更新表的情况下进行更改

时间:2015-05-28 16:37:34

标签: database oracle oracle11g

我使用ora_rowscn跟踪表格中已更改的行并使用更新的行。

上周我注意到,对于我使用rowdependencies创建的一些(不是全部)表格,ora_rowscn更改了表格中没有任何交易。我的意思是,如果我选择max(ora_rowscn)我会得到更高的数字。

以下是我创建表格的示例

  1. 创建表

    create table test ( test_id number, txt varchar2(5) ) rowdependencies;
    
  2. 在表格中插入了一些数据

    insert into test values(1,'a');
    insert into test values(2,'b');
    insert into test values(3,'c');
    
  3. 使用ORA_ROWSCN

    多次查询表格
    select max(ora_rowscn),max(b.current_scn) from test a, v$database b
    
  4. 每当我查询时,我都会得到更高的max(ora_rowscn)

    在MetaLink上我发现两个报告错误(错误14093863,错误9814923)似乎是同一个问题,但设置为不是错误。

    为什么会发生这种情况,让它发挥作用或修复它的解决方案是什么?

2 个答案:

答案 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;

这应该标识正在改变的行。