0

我有一个需要调用SQL Server 2008数据库每次调用最多需要15分钟的存储过程。长时间运行的存储过程对性能的影响

它会对访问相同数据库/数据库服务器的其他系统造成性能影响吗?如果是这样,我如何才能最大限度地降低性能影响

更新:存储过程比较审计历史记录,它需要根据记录的类型调用另一个存储过程,因此它必须逐行进行。我可以将游标更改为while循环,但可能会有超过300万行要处理(取决于过滤条件)。

+0

光标或while循环都是缓慢的,他们可能是你为什么SP是如此缓慢的原因。尝试用CTE替换它并加入 – 2013-04-12 05:22:35

回答

0

当proc处于活动状态时,查看服务器上的CPU活动。如果您知道如何使用PerfMon,则可以查看一些SQL Server计数器。

我想说15分钟的查询可能是优化的候选人。确保你有所有必要的索引并避免使用游标。

+0

感谢您的快速回复!存储过程必须对每一行执行某些操作,所以我在存储过程中使用了光标 - 您是否重新检查我应该从.net打开一个数据读取器连接,然后处理.net代码中的每一行? – developer 2013-04-05 15:28:26

+1

@Mait是的!什么!光标是你可以为你的性能做的最糟糕的事情之一,因为它们占用大量内存,使用光标的15分钟过程在执行期间肯定会影响整体服务器的性能。幸运的是,有很多好方法来替换游标。最好的选择是将您的查询转换为基于集合的操作。这里有一个很好的链接来解释这样做的各种方式 - http://wiki.lessthandot.com/index.php/Cursors_and_How_to_Avoid_Them – 2013-04-05 15:39:58

+0

@Mait最后,如果你没有找到一种方法来设置基于操作和确实需要逐行进行,但仍然有更好的选项,然后使用cursor - SQL while循环或.NET。 – 2013-04-05 15:40:46

0

选项1.按原样运行,但这很可能会导致性能问题。

选项2.如果可能,重做查询以提高性能。当然,它不能花费15分钟,除非你的SQL写得很糟糕,或者你只是在处理大量的数据。 也许发布SQL?

选项3.正如你所说,你可以在.NET中完成这项工作。

2

我通常可以通过使用带有需要处理的ID列表的连接来避免使用游标。您的游标查询通常可用作WITH子句或内部连接来选择要执行处理的语句中要处理的行。

但是请先检查索引。这是查询速度慢的最有害的原因。至少where子句中的每个列和连接中的所有ON列都应该编入索引。

0

我们对我们的服务器也有类似的问题。我的经验是SQL Server是相当资源密集的应用程序,如果你有这样一个sp,它将对服务器的性能产生巨大的影响。

这里有一些事情你可以检查,以提高SP的性能,或使用更少的资源:

1,运行查询分析器来检查,如果你丢失的索引,如果有添加。

2,如果使用临时表,尽量不要使用它。 Tempdb被SQL服务器用于每个数据库,如果您在sp中运用它时,它会在运行时阻止其他使用临时表的查询。或者,您可以使用cte。 3,重做你想做的更小,也许你可以把它分解成几个可以并行运行的较小的一个。

4,这是一个有线的。如果将参数传递给sp,在sp中,将这些参数分配给局部变量,并在sp中使用这些变量,而不是参数。 SQL服务器使用局部变量生成更好的执行计划。你会看到巨大的速度提升。你不会相信它。

如果你可以张贴SP,我很乐意帮助你做出更快

相关问题