Sql Update语句使用大数据集需要10分钟

Sql Update语句使用大数据集需要10分钟,sql,sql-server-2005,Sql,Sql Server 2005,我有一个SQL存储过程,其中一条语句需要95%的总时间(10分钟)才能完成#记录约有133000行,记录约有12000行 -- Check Category 1 first UPDATE #Records SET Id = (SELECT TOP 1 Id FROM Records WHERE Cat1=#Records.Cat1) WHERE Cat1 IS NOT NULL 我曾尝试在#Records中的Cat1中添加索引,但语句时间没有改善 CREATE CLUS

我有一个SQL存储过程,其中一条语句需要95%的总时间(10分钟)才能完成<代码>#记录约有133000行,
记录
约有12000行

  -- Check Category 1 first
  UPDATE #Records
    SET Id = (SELECT TOP 1 Id FROM Records WHERE Cat1=#Records.Cat1)
    WHERE Cat1 IS NOT NULL
我曾尝试在
#Records
中的
Cat1
中添加索引,但语句时间没有改善

CREATE CLUSTERED INDEX IDX_C_Records_Cat1 ON #Records(Cat1)
接下来的一个类似的陈述只花费了一小部分时间

  -- Check Category 2
  UPDATE #Records
    SET Id = (SELECT TOP 1 Id FROM Records WHERE Cat2=#Records.Cat2)
    WHERE ID IS NULL
关于为什么会发生这种情况,或者我能做些什么使这一声明更具时效性,有什么想法吗

提前谢谢


我正在Microsoft SQL Server 2005上运行此操作。

我想说,您的问题可能是使用了相关子查询而不是联接。联接在集合中工作,相关子查询逐行运行,本质上是游标

使用join-maybe更新

update t
set t.ID = r.ID
FROM (Select Min(ID) as ID,Cat1 From Records group by cat1) r 
INNER JOIN #Records t ON r.Cat1 = t.cat1 
Where t.cat1 is not null

根据我的经验,当您尝试更新大量记录时,有时使用游标并遍历记录比使用更新查询更快


也许这对你有帮助。

你检查过执行计划了吗?您的表和索引的布局是什么?在#Records.Cat1上的索引可能是一个好的开始。请发布索引。@MichaelTodd,这难道不会使更新花费更长的时间,因为索引也必须更新吗?@abe,是和否,索引还可以帮助插入涉及其他表的位置。这非常有效!非常感谢。需要注意的是,由于my
ID
是唯一标识符,
Min(ID)as ID
将不起作用。删除GROUPBY子句或向GROUPBY子句添加ID是可能的解决方案。我最终删除了group by子句。我不确定您在select top 1中使用ID做了什么,这似乎意味着子查询可以返回多个记录,并且您并不特别关心它返回了哪一个记录,mo9n是这样做的一种方式,他耸耸肩。是的,您是正确的。这正是发生的事情。谢谢。那会有用的,但是游标是sql中最后的解决方案。这不是不惜一切代价避免的,但如果可能的话,这是一种避免。