oracle11g – 了解Oracle中的ORA_ROWSCN行为

前端之家收集整理的这篇文章主要介绍了oracle11g – 了解Oracle中的ORA_ROWSCN行为前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
所以这基本上是 Finding duplicate records的后续问题.

我们每天从文本文件执行数据导入,最后我们导入了两次分布在182个文件中的10163条记录.在运行上述查询以查找重复项时,我们获得的记录总数为10174,比文件中包含的记录多11个记录.我假设2个记录的可能性完全相同,并且在查询中也考虑了有效记录.所以我认为最好使用时间戳字段并简单地找到今天运行的所有记录(因此最终添加重复的行).我使用ORA_ROWSCN使用以下查询

select count(*) from my_table
where TRUNC(SCN_TO_TIMESTAMP(ORA_ROWSCN)) = '01-MAR-2012'
;

但是,计数仍然更多,即10168.现在,通过在包含所有文件文件夹中运行以下命令,我非常确定文件中的总行数是10163. wc -l * .txt.

是否有可能找出实际插入两次的行?

默认情况下,ORA_ROWSCN存储在块级别,而不是行级别.如果表最初是在启用了ROWDEPENDENCIES的情况下构建的,则它仅存储在行级别.假设您可以在一个块中放置表的多行,并且您没有使用APPEND提示将新数据插入到表的现有高位标记之上,则可能会将新数据插入到已有的块中其中包含一些现有数据.默认情况下,这将更改块中每行的ORA_ROWSCN,从而导致查询计算的行数比实际插入的数量多.

由于ORA_ROWSCN仅保证在最后一行上存在DML的上限,因此通过向默认为SYSDATE的表添加CREATE_DATE列来确定今天插入了多少行将更为常见.在INSERT运行后依赖sql%ROWCOUNT(当然,假设您使用单个INSERT语句插入所有行).

通常,使用ORA_ROWSCN和SCN_TO_TIMESTAMP函数将是一种有问题的方法来识别何时插入行,即使该表是使用ROWDEPENDENCIES构建的. ORA_ROWSCN返回一个Oracle SCN,它是一个系统变更号.这是特定更改(即交易)的唯一标识符.因此,SCN与时间之间没有直接联系 – 我的数据库可能比您的数据库生成SCN快一百万倍,而且我的SCN 1可能与您的SCN 1年不同.Oracle后台进程SMON维护一个表将SCN值映射到近似时间戳,但它只在有限的时间内维护该数据 – 否则,您的数据库最终会得到一个数十亿行表,它只是将SCN存储到时间戳映射中.如果插入的行超过一周前(并且确切的限制取决于数据库数据库版本),则SCN_TO_TIMESTAMP将无法将SCN转换为时间戳并将返回错误.

猜你在找的Oracle相关文章