Sql server 如何基于其他行高效地更新表?

Sql server 如何基于其他行高效地更新表?,sql-server,tsql,Sql Server,Tsql,我有一个表,其中包括此列: id int identity(1,1) not null 我添加了一列来存储插入记录的大致日期: insertdate smalldatetime null 我已经填写了insertdate,在这里我可以使用在相关表格和日志的法医学搜索中发现的最早参考。但是,这确实会在数据中留下许多空间隙,并且在某些情况下,ID号较低的记录的insertdate值比后续的ID值更新 identity属性提供了一个充分的基础,可以假定记录必须在ID值较高的任何记录之前创建,因此我

我有一个表,其中包括此列:

id int identity(1,1) not null
我添加了一列来存储插入记录的大致日期:

insertdate smalldatetime null
我已经填写了insertdate,在这里我可以使用在相关表格和日志的法医学搜索中发现的最早参考。但是,这确实会在数据中留下许多空间隙,并且在某些情况下,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万条

如何更有效地做到这一点,有什么想法吗


它只需要执行一次,但这是一个生产服务器,因此我不希望锁定表的时间超过需要的时间。

不确定这是否有帮助,但您不需要测试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行吗? 有没有一点你很确定你不会找到一个更小的约会

在设置默认日期时,可以将表和t2限制为第一行的ID

可能会填写事务日志并回滚整个过程。 如果发生这种情况,请耐心等待,让它倒退。 如果您现在中止它,它将不得不回滚。
分批拆分100000将使事务日志得以清除

当然,此列上有一个新记录的默认设置。但是这个表已经超过10年了,insertdate列是新的,所以我试图根据我可以从其他表中拼凑的内容来确定现有记录的大致插入日期。谢谢@Blam,typo,修复了它。你可以通过在id insertdate上添加索引来帮助它,这样可以节省一些书签查找,但您可能希望将其分解为更小的更新,其中table.id位于@n和@n+100之间,循环中@n一次递增100。后续说明:到目前为止,最快的方法是从主表创建一个id和earliestdate为的临时表,并与之进行比较/联接。这需要为每个过程截断和重新填充表。限制更新的行数和搜索的行数是一个好策略,我在搜索每个5000个更高ID的窗口时一次搜索100000行取得了一些进展。接受这个答案。