使用大数据集更新语句需要10分钟

时间:2012-08-20 20:50:38

标签: sql sql-server-2005

我有一个SQL存储过程,其中一个语句占用总时间(10分钟)的95%完成。 #Records有大约133,000行,Records大约有12,000行。

  -- Check Category 1 first
  UPDATE #Records
    SET Id = (SELECT TOP 1 Id FROM Records WHERE Cat1=#Records.Cat1)
    WHERE Cat1 IS NOT NULL

我已尝试在Cat1中向#Records添加索引,但声明时间没有改善。

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上运行它。

3 个答案:

答案 0 :(得分:1)

我想说你的问题可能是你正在使用相关子查询而不是连接。连接工作集,相关子查询逐行运行并且基本上是游标。

答案 1 :(得分:1)

使用加入更新

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

答案 2 :(得分:0)

根据我的经验,当您尝试更新大量记录时,有时使用游标并迭代记录而不是使用更新查询会更快。

在你的情况下也许这有帮助。