0

我正在将应用程序从 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
4

1 回答 1

0

在阅读了所有建议之后,我最终做了一些老把戏,它创造了奇迹!

我有这个游标,它运行了将近 3 分钟,而封闭的查询是即时的。我有其他数据库具有更复杂的游标,只需要 1 秒或更短的时间,所以我排除了使用游标的全局问题。我的解决方案:

分离有问题的数据库,但确保勾选更新统计信息。附加数据库并检查性能 这似乎有助于优化所有性能参数,而无需进行详细的努力。我正在使用 SQL Express 2008 R2。

想知道你的经历。

于 2015-09-27T10:43:48.207 回答