我正在将应用程序从 SQL Server 2000 升级到 SQL Server 2008 R2,并遇到使用游标的存储过程的超时问题。例如,在 SQL Server 2000 中每秒处理 500 行的 SP 在 SQL Server 2008 中以每秒大约 5 行(和 100% CPU)的速度爬行。这是在 VM 中,但内存似乎不是问题.
我试过重置统计数据和重建索引,但没有任何效果。我可以重写 SP 以避免使用游标,但不希望扩大范围以包括这些重写。
有没有人遇到过这个问题?
下面是一个简单的 SP 示例,它在升级后需要大约 100 倍的时间。在我对 SQL Server 2008 R2 的测试中,处理 4000 行需要 12 秒。
--set ids by alphabetical order
declare cursor1 CURSOR
FOR
select id from form_import_current_data
where master_formulary_id = @Master_Formulary_ID
order by description, description2
open cursor1
declare @id int
declare @id_counter int
set @id_counter = 1
FETCH NEXT FROM cursor1 INTO @id
while (@@FETCH_STATUS <> -1)
BEGIN
IF(@@FETCH_STATUS <> -2)
BEGIN
update form_import_current_data
set id = @id_counter
where master_formulary_id = @Master_Formulary_ID
and id = @id
set @id_counter = @id_counter + 1
END
FETCH NEXT FROM cursor1 INTO @id
END
CLOSE cursor1
DEALLOCATE cursor1