Oracle11g 了解Oracle中的ORA_ROWSCN行为
因此,这本质上是一个后续问题 我们每天从文本文件导入数据,最终两次导入了分布在182个文件中的10163条记录。在运行上述查询以查找重复项时,我们得到的记录总数为10174,比文件中包含的记录多11条。我假设两条记录可能完全相同,并且在查询中也是有效的记录。因此,我认为最好使用一个timestamp字段,简单地查找今天运行的所有记录(并因此添加了重复的行)。我使用ORA_ROWSCN使用以下查询:Oracle11g 了解Oracle中的ORA_ROWSCN行为,oracle11g,Oracle11g,因此,这本质上是一个后续问题 我们每天从文本文件导入数据,最终两次导入了分布在182个文件中的10163条记录。在运行上述查询以查找重复项时,我们得到的记录总数为10174,比文件中包含的记录多11条。我假设两条记录可能完全相同,并且在查询中也是有效的记录。因此,我认为最好使用一个timestamp字段,简单地查找今天运行的所有记录(并因此添加了重复的行)。我使用ORA_ROWSCN使用以下查询: select count(*) from my_table where TRUNC(SCN_TO_
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\u DATE
列,或者在运行INSERT
之后依赖SQL%ROWCOUNT
来确定今天插入了多少行,这将更为常见(当然,假设您使用一条INSERT
语句来插入所有行)
通常,使用
ORA_ROWSCN
和SCN_TO_TIMESTAMP
函数来识别何时插入了行是一种有问题的方法,即使表是用行依赖关系构建的ORA_ROWSCN
返回一个Oracle SCN,它是一个系统更改号。这是特定变更(即交易)的唯一标识符。因此,SCN和时间之间没有直接的联系——我的数据库生成SCN的速度可能比你的快一百万倍,我的SCN 1可能与你的SCN 1相差几年。Oracle后台进程SMON
维护一个将SCN值映射到近似时间戳的表,但它只在有限的时间段内维护该数据——否则,您的数据库将得到一个数十亿行的表,该表只存储SCN到时间戳的映射。如果插入行的时间超过一周(具体限制取决于数据库和数据库版本),SCN\u TO\u TIMESTAMP
将无法将SCN转换为时间戳,并将返回错误。谢谢Justin。您能告诉我是否可以将数据导出到包含ORA_ROWSCN
的查询的分隔文件中吗?我正试图在SQL Developer中导出数据,但导出失败,列ORA_ROWSCN
@darkie15无法识别-您应该能够--我刚才已经这样做了。我不知道你为什么要这样做--将SCN放在平面文件中有什么好处?我不是说在文件中添加SCN,但当我右键单击表的“数据”选项卡,单击“导出”,然后在where子句中输入ORA_ROWSCN时,它抛出一个错误,说或_ROWSCN无效。总之,我找到了答案。因此,如果我现在想将行依赖项添加到现有表中,如果我是对的,我就不能执行altertable
。我可以删除并重新创建添加行依赖项的表吗?此链接:建议从服务中取出架构。。。我们是否可以在不接触架构和添加ROWDEPENDENCIES
的情况下重新创建表?@darkie15-您可以删除并重新创建带有ROWDEPENDENCIES
的表(尽管您可能需要做些事情来保存数据)。但是如果要这样做,最好添加一个CREATE_DATE
列,该列默认为SYSDATE
,而不是依赖SCN来确定今天插入了多少行。