0

我有一个性能问题
,我需要从 .Net 1.1 运行存储过程。这个存储过程调用了 8 个存储过程。它们中的每一个都处理信息以在旧信息和新信息之间进行比较,并影响数据库中的物理表。

问题来了,因为我尝试直接从 SSMS 运行它。服务器开始崩溃,变得如此缓慢,几乎无法工作。我认为基础设施人员必须直接在服务器上重新启动服务。

我在开发环境中工作,所以没有太大问题,但我无法将其上传到生产环境中。

我一直在考虑使用程序仅用于比较目的,从不影响物理数据。在主体过程的临时表中从它们中检索信息,然后打开我的 try-catch 和 begin-end 事务块并影响存储在临时表中的信息的主体中的数据库。

我的主要存储如下所示:这是我能做到这一点的最佳方式吗?

create proc spTest
as
/*Some processes here, temporary tables, etc...*/
begin try
begin distributed transaction
sp_nested1
sp_nested2
sp_nested3
sp_nested4
sp_nested5
sp_nested6
sp_nested7
sp_nested8
/*more processes here, updates, deletes, extra inserts, etc...*/
commit transaction
end try
begin catch
rollback transaction
DECLARE @ERROR VARCHAR(3000)
SELECT @ERROR = CONVERT(VARCHAR(3000),ERROR_MESSAGE())
RAISERROR(@ERROR,16,32)
RETURN
end catch

每个嵌套存储过程的基本结构相似,但不调用任何其他过程,只有每个都有自己的 try 和 catch 块。

任何帮助将不胜感激......我使用的版本是 SQL Server 2005

谢谢大家....

4

1 回答 1

2

首先,当事情进展缓慢时,您所写的内容可能存在问题。首先要看的是每个存储过程的执行计划。你有表扫描吗?

你有没有单独运行每一个,看看每一个有多快?这将帮助您确定问题是 8 procs 还是其他问题。您似乎涉及很多步骤,过程可能是问题,也可能不是问题。

您是否使用游标或 while 循环或标量用户定义函数或相关子查询逐行处理数据?这会极大地影响速度。你有正确的索引吗?你的查询语句是 sargable 吗?我看到您有一个分布式事务,您确定运行 proc 的用户在其他服务器上具有正确的权限吗?并且服务器存在并且正在运行?临时数据库中的空间不足了吗?您是否需要分批运行而不是尝试跨多个服务器更新数百万条记录?

没有看到这个混乱,很难确定是什么导致它变慢。

但我将分享我如何处理长而复杂的过程。首先,它们都有一个测试变量,我在最后使用它来回滚事务,直到我确定我正在执行正确的操作。我还返回在回滚之前插入的结果。现在这最初不会帮助解决速度问题。但是无论如何都要设置它,因为如果您无法从执行计划中找出问题所在,那么您可能想要做的就是注释掉除第一步之外的所有内容,然后在测试模式(和回滚)下运行 proc继续添加步骤,直到你看到它被卡住的那个。当然可能不止一个。

于 2010-12-01T22:13:00.703 回答