我需要对表格进行游标更新(数百万行)。如果脚本将再次启动(例如,在服务器重新启动的情况下),脚本应该从上次更新的行恢复。
解决此问题的最佳方法是什么?使用上次保存的ID创建一个新表?使用表扩展属性来保存此信息?
答案 0 :(得分:0)
我会添加" UpdateDate"或" LastProcessDate"或者一些类似命名的日期时间列到您的表并使用它。运行更新时,只需处理不是最大UpdateDate或为空的任意数量的记录:
where UpdateDate < (select max(UpdateDate) from MyTable) or UpdateDate is null
在进程/循环开始时获取最大UpdateDate(@maxUpdateDate
?)可能是一个好主意,因此它在批处理期间不会发生变化,同样会获得一个新的UpdateDate({ {1}}?)在流程开始时随时更新每一行。 UTC日期最适合避免DST时间变化。
此数据现在是您实体的真实属性,而不是元数据或临时占位符,这似乎是事务一致性和完全ACID的最佳方式。它也比其他方法更自我记录,并且可以在需要时编入索引。日期还可以包含有关数据的重要时态信息,而ID和标志则不包含。
以这种方式执行此操作会使存储其他表或扩展属性的数据变得多余。
其他一些想法:
@newUpdateDate
似乎在回滚时看起来行为正确,但我不确定锁定是如何工作的 - 如果您最终决定沿着这条路走下去,那就是FYI。