0

我有一个包含此列的表(除其他外):

id int identity(1,1) not null

我添加了一个列来存储插入记录的大致日期:

insertdate smalldatetime null

我已经填写了insertdate我可以使用在相关表和日志的取证搜索中找到的最早参考资料的地方。但是,这确实会在数据中留下许多 NULL“空白”,以及 ID 号较低的记录具有insertdate比后续 ID 值更新的值的情况。

identity属性提供了充分的基础来假设必须在任何具有更高ID值的记录之前创建记录,因此我决定更新insertdate它为 null 或后续 ID 具有更早日期的任何记录:

UPDATE
table
SET
insertdate = (SELECT MIN(insertdate) 
      FROM table t2
      WHERE
        t2.id >= table.id 
        AND t2.insertdate IS NOT NULL
      )

不幸的是,像这样的更新正在吃服务器的午餐...... 1 小时并计算 250 万条记录。

关于如何更有效地做到这一点的任何想法?

它只需要完成一次,但这是一个生产服务器,所以我宁愿不要锁定表超过必要的时间。

4

1 回答 1

2

不确定这会有所帮助,但您不需要测试 null。
Min() 不会考虑空值。

UPDATE
table 
SET
insertdate = (SELECT MIN(t2.insertdate) 
                FROM table t2
               WHERE t2.id >= table.id 
                 AND t2.ID < table.id + 10000)  

你能限制到接下来的 x 行吗?
有没有一点你很确定你不会找到更小的约会对象?

当您设置默认日期时,您可以将 table 和 t2 限制为第一行的 ID。

可能会填满事务日志并将整个事情回滚。
如果发生这种情况,请耐心等待并让它回滚。
如果您现在中止它,它将不得不回滚。
100000 分批拆分是要让事务日志清零的。

于 2012-10-08T20:24:57.483 回答