我们在从时态表加载数据时使用标准方法 - 通过将周期开始列值与最新加载时间戳进行比较来获取上次加载后发生的所有更改。
根据 MSDN 文档(同样适用于更新和删除(
插入:在插入上,系统设置 SysStartTime 的值 列到当前事务的开始时间(采用 UTC 时间( zone(,基于系统时钟,并为 SysEndTime 列的最大值为 9999-12-31。这标志着 行为打开。
假设我们在2019-12-02 15:27:00
开始一些长时间运行的事务,例如
BEGIN TRAN;
WAITFOR DELAY '00:03:00';
UPDATE a
SET account_balance = 999
FROM dbo.accounts AS a
WHERE a.id= 'XXXXX'
COMMIT;
我们的最后一次装载是在2019-12-02 15:26:00
.因此,当我们运行 ETL 时,它将获得所有修改后的更改:
SELECT * FROM dbo.accounts WHERE SysSstart > '2019-12-02 15:26:00'
假设 ETL 在2019-12-02 15:28:00
时完成并保存了该值。
由于我们延迟了 3 分钟,然后 UPDATE 在2019-12-02 15:30:00
完成,但SysStart
列值将像更新事务开始时一样2019-12-02 15:27:00
。因此,如果我们再次运行 ETL,则不会加载此事务中更新的记录,因为它们与谓词不匹配SysSstart > '2019-12-02 15:28:00'
。
如何处理这种情况?
这可能是一个更好的解决方案,但现在我得到了这两个简单的想法(因为似乎您只需要知道上次更新何时发生(:
- 将 LoadDateTime 添加到您的 dbo.accounts 并在查询中使用它 选择 * 来自 dbo.accounts 其中加载日期时间> '2019-12-02 15:26:00'
- 在 ETL 开始时保存,而不是在 ETL 结束时保存