我正在尝试通过ETL Datastage将数据从DB2表加载到Netezza。这是针对时间戳列的增量加载。 所以源SQL就像
select * from db2_table where timestamp_column > '2017-02-10 08:24:00';
在Netezza表中加载数据后,当我在查询下运行并得到以下结果时。
select max(timestamp_column) from netezza_table;
返回'2017-02-10 11:17:56'
这对我来说很好看。
但是我注意到我们在DB2表中有一条记录,其timestamp_column是'2017-02-10 11:17:54'
,尽管目标Netezza表中缺少该数据。
这不是常规问题,但是当问题发生时,我注意到缺少记录的timestamp_column
值小于1或2秒。
我的问题是,如果Netezza中的max(timestamp_column)
值为'2017-02-10 11:17:56'
,则ETL作业应该已获取'2017-02-10 11:17:54'
记录。
如何错过这条记录?
答案 0 :(得分:0)
完全有可能更新了ETL作业读取行之后提交的'2017-02-10 11:17:54'
记录的事务。 DB2数据库中的缺省隔离级别(我假设DB2 for LUW)是CS,它只在处理游标时锁定当前行,而其他事务可以自由更新已经读取的行。
您可以尝试将ETL作业的隔离级别增加到RR,以确保在您阅读完成后不会更改结果集,但请记住,它会影响DB2上的更新并发性侧。
答案 1 :(得分:0)
解决问题的方法可能是行更改时间戳。 DB2在插入或更新时自动生成此时间戳,因此是确定增量的完美解决方案。 像这样
在源表中添加一个额外的列rct timestamp not null generated always for each row on update as row change timestamp
为避免因DDL更改而发生冲突,您还可以将此列定义为“隐藏”。这意味着它可以明确选择,但在运行
时不会返回SELECT * FROM tab