Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/magento/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle11g 了解Oracle中的ORA_ROWSCN行为_Oracle11g - Fatal编程技术网

Oracle11g 了解Oracle中的ORA_ROWSCN行为

Oracle11g 了解Oracle中的ORA_ROWSCN行为,oracle11g,Oracle11g,因此,这本质上是一个后续问题 我们每天从文本文件导入数据,最终两次导入了分布在182个文件中的10163条记录。在运行上述查询以查找重复项时,我们得到的记录总数为10174,比文件中包含的记录多11条。我假设两条记录可能完全相同,并且在查询中也是有效的记录。因此,我认为最好使用一个timestamp字段,简单地查找今天运行的所有记录(并因此添加了重复的行)。我使用ORA_ROWSCN使用以下查询: select count(*) from my_table where TRUNC(SCN_TO_

因此,这本质上是一个后续问题

我们每天从文本文件导入数据,最终两次导入了分布在182个文件中的10163条记录。在运行上述查询以查找重复项时,我们得到的记录总数为10174,比文件中包含的记录多11条。我假设两条记录可能完全相同,并且在查询中也是有效的记录。因此,我认为最好使用一个timestamp字段,简单地查找今天运行的所有记录(并因此添加了重复的行)。我使用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\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来确定今天插入了多少行。