【发布时间】:2009-12-04 22:49:52
【问题描述】:
我注意到在 SQL Server 2005 上有几个存储过程,当从我的 ASP.NET MVC 应用程序调用时突然需要很长时间才能完成,该应用程序在四台服务器的 IIS6 网络场中运行。正常,预期执行时间小于一秒;意外异常执行时间为 25-45 秒。这个问题似乎永远不会自行纠正。
但是,如果我 ALTER 存储过程(即使我没有更改过程中的任何内容,除了可能在 SSMS Modify 命令创建的脚本中添加一个空格),完成时间将恢复为预期的完成时间。
IIS 和 SQL Server 在不同的机器上运行,两者都运行 Windows Server 2003 R2 Enterprise Edition。 SQL Server 是标准版。所有机器都有双 Xeon E5450 3GHz CPU 和 4GB RAM。 SQL Server 是通过千兆以太网使用其 TCP/IP 协议访问的(不确定是什么物理介质)。
网络场中的所有网络服务器都存在问题。当我从开发机器上的 SSMS 中的查询窗口调用该过程时,该过程在正常时间内完成。这很奇怪,因为我的印象是 SSMS 使用与 .NET 中相同的 SqlClient 驱动程序。当我将 Web 应用程序的开发实例指向生产数据库时,我再次得到异常长的完成时间。如果我的 SqlCommand Timeout 太短,我会得到 p>
System.Data.SqlClient.SqlException: 超时已过。超时时间 在完成之前经过 操作或服务器不 回应。
问题:为什么要对存储过程执行 ALTER,而不实际更改其中的任何内容,将完成时间恢复到不到一秒,正如预期的那样?
编辑:澄清一下,当应用程序运行缓慢时,它同时在具有相同参数的 SSMS 中运行良好。我能辨别的唯一区别是登录凭据(下次我注意到这种行为时,我将使用相同的凭据从 SSMS 进行检查)。最终目标是让 proc 以预期的速度持续运行,而无需偶尔干预。
解决方案:我想更新此问题,以防其他人遇到此问题。按照以下答案的线索,我能够始终如一地重现这种行为。为了测试,我使用sp_recompile 并将其传递给易受攻击的存储过程之一。然后我从浏览器发起一个网站请求,该请求将使用非典型参数调用存储过程。最后,我向一个使用典型参数调用 sproc 的页面发起网站请求,并观察到由于 sproc 调用的 SQL 超时,该请求没有完成。
为了在 SQL Server 2005 上解决此问题,我在我的 SELECT 中添加了 OPTIMIZE FOR 提示。易受攻击的存储过程都具有this article 中描述的“一体化”模式。这种模式当然不理想,但考虑到项目的时间框架,这是一个必要的权衡。
【问题讨论】:
标签: .net sql-server performance stored-procedures