【问题标题】:Understanding the ORA_ROWSCN behavior in Oracle了解 Oracle 中的 ORA_ROWSCN 行为
【发布时间】:2012-03-02 05:17:11
【问题描述】:

所以这本质上是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.

是否有可能找出哪些行实际上被插入了两次?

【问题讨论】:

    标签: oracle11g


    【解决方案1】:

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

    由于 ORA_ROWSCN 仅在最后一次在行上存在 DML 时才保证为上限,因此更常见的做法是通过向默认为SYSDATE 的表或在INSERT 运行后依赖SQL%ROWCOUNT(当然,假设您使用单个INSERT 语句来插入所有行)。

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

    【讨论】:

    • 谢谢贾斯汀。您能否告诉我是否可以将数据导出到包含ORA_ROWSCN 的查询的分隔文件?我正在尝试在 SQL Developer 中导出数据,但导出失败并出现无法识别的列 ORA_ROWSCN
    • @darkie15 - 你应该能够 - 我刚刚这样做了。不过,我不确定您为什么要这样做 - 将 SCN 放在平面文件中会有什么好处?
    • 我的意思不是在文件中添加 SCN,但是当我右键单击我的表的数据选项卡,单击导出并在 where 子句中输入 ORA_ROWSCN 时,它会抛出一个错误,说 OR_ROWSCN 无效。反正我想通了。
    • 因此,如果我现在想将 ROWDEPENDENCIES 添加到现有表中,如果我是对的,我无法执行alter table。我可以删除并重新创建添加ROWDEPENDENCIES 的表吗?此链接:forums.oracle.com/forums/thread.jspa?threadID=1111022 建议从服务中取出架构......我们是否可以在不触及架构并添加 ROWDEPENDENCIES 的情况下重新创建?
    • @darkie15 - 您可以使用ROWDEPENDENCIES 删除并重新创建表(尽管您可能想要做一些事情来保存数据)。但是,如果您要这样做,添加一个默认为 SYSDATECREATE_DATE 列可能会更好,而不是依靠 SCN 来确定今天插入了多少行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-01
    • 2017-05-28
    • 1970-01-01
    • 2010-10-06
    • 1970-01-01
    • 2015-03-07
    相关资源
    最近更新 更多