我有一个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上运行它。
答案 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)
根据我的经验,当您尝试更新大量记录时,有时使用游标并迭代记录而不是使用更新查询会更快。
在你的情况下也许这有帮助。