我有一个包含此列的表格(以及其他内容):
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万条记录。
有关如何更有效地完成此任务的任何想法?
它只需要完成一次,但这是一个生产服务器,所以我宁愿不要长时间锁定表。
答案 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将使事务日志清晰。