如何基于其他行有效地更新表?

时间:2012-10-08 20:01:01

标签: sql-server tsql

我有一个包含此列的表格(以及其他内容):

id int identity(1,1) not null

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

insertdate smalldatetime null

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

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万条记录。

有关如何更有效地完成此任务的任何想法?

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

1 个答案:

答案 0 :(得分: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。

可能会填写事务日志并将整个事情回滚。
如果发生这种情况,请耐心等待,让它回滚 如果你现在中止它将不得不回滚。
分批破解100,000将使事务日志清晰。