你会怎么做?
我正在对当前没有Date_added / Date_updated列的数据库执行ETL过程。 DBA不希望向表中添加Date列,因此我必须找到一些替代方法,仅选择新的/更改的记录进行夜间提取。数据库非常庞大,因此如果可能的话,解决方案必须具有空间/时间效率。
解决一些后续问题:
**表没有启用行依赖性。
1)表有PK吗?是的,每个表都有PK,它本身就是唯一的。
2)巨大的数据库是......数十亿,数百万?目前最大的表中有1000万条记录
3)夜间提取的新/更改记录的数据子集大小?我估计每个客户端有2000行,有100个客户端可以给出200000个。
4)夜间提取中的任何独特值?每个模式中都有唯一的值。
答案 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
根据表创建参数ROWDEPENDENCIES
或NOROWDEPENDENCIES
(默认值),ORA_ROWSCN
适用于行或块级别。行级别可能最适合您的目的,但在创建表后无法更改,因此需要备份数据,删除表,重新创建具有行依赖关系的表,还原数据...
更多信息:http://docs.oracle.com/cd/E11882_01/server.112/e26088/pseudocolumns007.htm#SQLRF50953
答案 2 :(得分:1)
如果您的PK是按序列递增的数字 AND ,那么您可以在控制表中记录开始和结束时间以及ID。控制表将具有一系列批量主键。控制表可以包含日期,表名(如果要为多个作业应用该设计),状态等。