是否有任何方法只选择Oracle中没有Date列或行依赖的新/更改行?

时间:2014-07-14 03:33:07

标签: sql database oracle data-warehouse

你会怎么做?

我正在对当前没有Date_added / Date_updated列的数据库执行ETL过程。 DBA不希望向表中添加Date列,因此我必须找到一些替代方法,仅选择新的/更改的记录进行夜间提取。数据库非常庞大,因此如果可能的话,解决方案必须具有空间/时间效率。

解决一些后续问题:

**表没有启用行依赖性。

1)表有PK吗?是的,每个表都有PK,它本身就是唯一的。

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

3)夜间提取的新/更改记录的数据子集大小?我估计每个客户端有2000行,有100个客户端可以给出200000个。

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

3 个答案:

答案 0 :(得分:2)

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

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

因此,每天都可以使用MINUS来查看更改,如

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

<强>参考

Using Oracle Flashback Technology on Oracle® Database Advanced Application Developer's Guide

答案 1 :(得分:1)

您可以查看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

答案 2 :(得分:1)

如果您的PK是按序列递增的数字 AND ,那么您可以在控制表中记录开始和结束时间以及ID。控制表将具有一系列批量主键。控制表可以包含日期,表名(如果要为多个作业应用该设计),状态等。