【发布时间】:2011-11-18 11:16:22
【问题描述】:
我有一个 .NET 4.0 Winform 和一个 .NET 4.0 Windows 服务,它们都通过 LINQ to SQL 连接到 SQL 2005/2008 数据库。它在我们的测试环境中运行良好且快速,具有完美的生产数据克隆,但在生产环境中,它运行非常缓慢,并且 CPU 使用率和带宽使用率很低。我还注意到每天有数百次 SQL 超时,即使对于索引良好的数据库上的最小查询也是如此。所以我启动了 Profiler...
我发现在负载下的 10 分钟捕获期间,sp_reset_connection 占总 SQL CPU 持续时间的三分之一和总 SQL 调用的 90%。
- 我已尝试禁用和启用连接池,并调整连接字符串中允许的连接数和连接超时。没有任何效果。
- 当我遇到 LINQ 查询时,我一直在用 ADO.NET 查询替换它们。这些旧的 ADO.NET 查询永远不会超时。只有 LINQ。
- 我注意到该服务器上的其他主要性能问题,但我不确定如何与客户的系统管理员联系。
我对运行该服务的应用程序服务器具有管理员访问权限。我几乎无法访问他们运行 Winform 的终端服务器,也无法访问 SQL 服务器。
是什么导致 sp_reset_connection 如此频繁地运行?
- 有没有一种方法可以绕过这些调用,而不会从我的应用程序中删除所有 LINQ?
- 有没有办法减少对该存储过程的调用次数?
- 有没有办法减少 SQL Server 执行这些调用所需的处理器时间?
- 如果我禁用池并将存储的过程替换为一个空的过程,我会搞砸什么吗?
【问题讨论】:
标签: c# sql linq-to-sql query-optimization connection-pooling