【问题标题】:Performance impact of long running stored procedure长时间运行的存储过程的性能影响
【发布时间】:2013-04-05 15:20:13
【问题描述】:

我需要调用一个存储过程,在 SQL Server 2008 数据库上每次调用最多需要 15 分钟。

会不会对访问同一数据库/数据库服务器的其他系统造成性能影响?如果是这样,我怎样才能最大限度地减少对性能的影响?

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

【问题讨论】:

  • cursor 或 while 循环都很慢,这可能是你 sp 这么慢的原因。尝试用 CTE 替换它并加入

标签: sql sql-server performance stored-procedures long-running-processes


【解决方案1】:

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

但请先检查索引。这是导致查询缓慢的最不利原因。至少应为 where 子句中的每一列和连接中的所有 ON 列建立索引。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 感谢您的快速回复!存储过程必须对每一行执行某些操作,所以我在存储过程中使用游标 - 你认为我应该从 .net 打开一个数据读取器连接并在 .net 代码中处理每一行吗?
    • @Mait 是的!任何事物!游标是您可以为性能做的最糟糕的事情之一,因为它们占用大量内存,并且使用游标的 15 分钟过程肯定会在执行期间对整体服务器性能产生影响。幸运的是,有很多好方法可以替换游标。最好的选择是将您的查询转换为基于集合的操作。这是一个很好的链接,解释了各种方法 - wiki.lessthandot.com/index.php/Cursors_and_How_to_Avoid_Them
    • @Mait 最后,如果您找不到移动到基于集合的操作的方法并且确实需要逐行进行,那么仍然有比光标更好的选择 - SQL while 循环或 .NET。
    • @Nenad 我已经用存储过程所需的功能更新了这个问题。
    • 我想知道是否有任何方法可以限制 SQL Server 使用有限的资源来执行此存储过程,以便它可以运行更长的时间而不影响其他数据库查询?
    【解决方案3】:

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

    选项 2。如果可能,重做查询以提高性能。除非你的 SQL 写得不好,或者你只是在处理大量数据,否则肯定不会花费 15 分钟。 也许发布SQL??

    选项 3。正如您所提到的,您可以在 .NET 中完成这项工作。

    【讨论】:

      【解决方案4】:

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

      您可以检查以下几项以提高 sp 的性能,或减少资源的使用:

      1,运行查询分析器检查是否缺少索引,如果有,请添加它们。

      2,如果你使用临时表,尽量不要使用它。 SQL Server 对每个数据库都使用 Tempdb,如果你在你的 sp 中经常使用它,当它运行时,它将阻止其他使用临时表的查询。或者,您可以使用 cte。

      3,重做sp变小,也许你可以把它分成几个更小的可以并行运行的。

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

      如果你能发sp,我很乐意帮你制作更快

      【讨论】:

        猜你喜欢
        • 2019-03-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-12
        • 2017-09-22
        相关资源
        最近更新 更多