gpt4 book ai didi

oracle11g - 了解 Oracle 中的 ORA_ROWSCN 行为

转载 作者:行者123 更新时间:2023-12-01 23:38:55 25 4
gpt4 key购买 nike

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

ORA_ROWSCN只保证是最后一次对某一行进行 DML 时的上限,通过添加 CREATE_DATE 来确定今天插入了多少行会更常见。表中的列默认为 SYSDATE或依靠SQL%ROWCOUNT在您的INSERT之后运行(当然,假设您使用单个 INSERT 语句插入所有行)。

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

关于oracle11g - 了解 Oracle 中的 ORA_ROWSCN 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9520995/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com