0

我有一个 SQL 存储过程,其中一个语句需要 95% 的总时间(10 分钟)才能完成。#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在 in 中添加索引#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 上运行它。

4

3 回答 3

1

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

于 2012-08-20T21:53:43.200 回答
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
于 2012-08-20T22:07:58.247 回答
0

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

也许这对您有帮助。

于 2012-08-21T10:43:39.790 回答