用于修复.NET应用程序以解决SQL Server超时问题并缩短执行时间的清单
一个清单清单,用于缩短.NET代码和SQL Server之间的执行时间。
从基本到怪异的解决方案都值得赞赏。
代码:
通过avgbody更改命令和连接中的默认超时。
使用存储过程调用而不是avgbody的内联sql语句。
使用Jay Shepherd的"活动监视器"查找阻止/锁定。
SQL Server:
注意AlexCuse在存储过程中的参数嗅探。
提防Martin Clarke动态地扩展数据库。
使用Profiler来查找任何查询/存储过程,而BradO花费的时间超过100毫秒。
通过Avgbody增加事务超时。
通过avgbody将动态存储过程转换为静态过程。
通过Jay Shepherd检查服务器的繁忙程度。
解决方案
回答
首先,首先检查正在运行的实际查询。我在通过程序设置时使用SQL Server Profiler,并在可能的情况下检查所有查询是否使用正确的联接和引用键。
回答
一些快速的...
- 检查处理器对服务器的使用情况,看它是否太忙
- 使用"活动"监视器查找阻止/锁定正在进行的操作
- 网络问题/性能
回答
对于响应时间长的投诉,一个怪异的"解决方案"是拥有一个更有趣的进度栏。含义,取决于用户的感觉。 Windows Vista等待图标就是一个例子。快速旋转的圆圈使人感觉事情进展得更快。 Google在Android上使用了相同的技巧(至少是我所见过的版本)。
但是,我建议我们尝试首先解决技术问题,并且仅在我们选择不了时才研究人类行为。
回答
过去,我的一些解决方案是:
- 修复sqlcommand的默认超时设置:将myCommand设置为新SqlCommand(" [dbo]。[spSetUserPreferences]",myConnection)myCommand.CommandType = CommandType.StoredProcedure myCommand.CommandTimeout = 120
- 增加连接超时字符串:数据源= mydatabase;初始目录=匹配;持久安全信息= True;用户ID =用户;密码=密码;连接超时= 120
- 在sql-server 2005中增加事务超时在管理工作室中,工具>选项>设计器在以下情况下增加事务超时:即使选中/取消选中了覆盖表设计器更新的连接字符串超时值。
- 将动态存储过程转换为静态过程
- 使代码调用存储过程,而不是在代码中编写内联sql语句。
回答
运行Profiler来测量查询的执行时间。
检查应用程序日志记录是否有任何死锁。
回答
我也喜欢使用SQL Server Profiler。我想在工作日中在其数据库服务器上的客户端站点上设置跟踪,以花费15-30分钟的时间,并记录所有持续时间> 100毫秒的查询/存储过程。无论如何,这是我的"长期运行"查询的标准。
回答
适用于SQL Server 2000的奇怪的一种,今天可能仍然适用:
确保我们没有尝试在生产中动态扩展数据库。有一个问题是,分配额外空间所花费的时间以及正常的负载运行将导致查询超时(并且增长!)。
回答
我们正在使用存储过程吗?如果是这样,我们应该提防参数嗅探。在某些情况下,这可能会导致一些运行时间非常长的查询。一些阅读:
http://blogs.msdn.com/queryoptteam/archive/2006/03/31/565991.aspx
http://blogs.msdn.com/khen1234/archive/2005/06/02/424228.aspx