在Oracle中是否有方法可以只选择没有日期列或行依赖的新/更改行?



你会怎么做呢?

我正在做一个数据库上的ETL进程,目前没有Date_added/Date_updated列。DBA不希望在表中添加Date列,因此我必须找到一些替代方法,只选择用于夜间提取的新/更改记录。数据库是巨大的,所以解决方案必须是空间/时间有效的,如果可能的话。

解决一些后续问题:

**表没有启用行依赖。

1)表中是否有PK?是的,每个表的PK只在其内部是唯一的。

2)巨大的DB是....数十亿,数百万?当前最大的表中有1000万条记录

3)每晚提取的新/更改记录的数据子集大小?我猜每个客户端大约2000行,乘以100个客户端得到200000行。

4)夜间提取有什么独特的值吗?每个模式中都有唯一的值。

如果您已经为Oracle闪回事务查询特性配置了数据库,那么您可以查询过去日期的数据库,如下所示:

SELECT * 
FROM mytable
AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '1' DAY);

因此,每天都可以通过使用减号看到变化,如

SELECT *
FROM mytable
MINUS
SELECT * 
FROM mytable
AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '1' DAY);
参考

:

在Oracle®数据库中使用Oracle闪回技术

您可以查看ora_rowscn,它是最近对一行进行更改的系统更改号(SCN):

CREATE TABLE bla (foo NUMBER NOT NULL) ROWDEPENDENCIES;
INSERT INTO bla VALUES (1);
COMMIT;
SELECT ORA_ROWSCN, foo FROM bla;
--10832905928770
INSERT INTO bla VALUES (2);
COMMIT;
SELECT ORA_ROWSCN, foo FROM bla;
--10832905928770    1
--10832905928816    2
SELECT ORA_ROWSCN, foo FROM bla where ora_rowscn > 10832905928770;
--10832905928816    2

根据表创建参数ROWDEPENDENCIESNOROWDEPENDENCIES(默认),ORA_ROWSCN在行或块级别上工作。行级别可能最适合您的目的,但它不能在表创建后更改,所以一些备份数据,删除表,重新创建具有行依赖关系的表,恢复数据将是必要的…

更多信息:http://docs.oracle.com/cd/E11882_01/server.112/e26088/pseudocolumns007.htm#SQLRF50953

如果你的PK是数字生成的顺序递增,那么你可以记录开始和结束的时间和ID在一个控制表。控制表将具有一系列批处理主键。控制表可以有日期、表名(如果您想在多个作业中应用该设计)、状态等。

最新更新