通过网络从C#.Net应用程序运行相同的存储过程会随着每次后续执行而逐渐变慢.它似乎比前一次执行花费的时间长两倍(最大值;读取).执行时间逐渐变慢,直到2个场景中的1个发生,此时SPROC的第一次执行再次"快速".
SqlConnection在所有测试期间打开并保持打开状态,则SPROC会逐渐变慢,直到运行任何其他 SPROC 或查询.SqlConnection在每次执行时打开和关闭,SPROC会逐渐变慢,直到至少8分钟过去.只有少数存储过程才会发生这种情况.一个是SELECT2 的简单查询JOINs,(SPROC 1)另一个是大规模1600+线SPROC(SPROC 2).
对于SPROC 1,执行时间似乎永远不会超过60秒,对于SPROC 2,执行时间似乎不会超过67秒.SPROC 1最初执行时间不到一秒,SPROC 2最初需要7秒.
只有SqlConnection在应用程序中使用SPROC运行SPROC时,才会发生这种情况.一旦使用了2个单独的SqlConnection对象,它们的行为与上述相同,但是是独立的.多次运行SPROC SqlConnection1会逐渐变慢,但第一次运行相同的SPROC时SqlConnection2,它会"快速".当多次运行时,它也会变慢SqlConnection2.
如果应用程序在安装了SQL Server 2008 R2的同一台计算机上运行(运行Windows Server 2008),则不会发生这种情况.执行时间始终一致.
从Management Studio中运行存储过程也不会因每次执行而变慢; 它总是一致的.
清除执行计划缓存(在SQL Server中)对观察到的行为没有影响.
为了创建一个测试应用程序以轻松测试/重现它,需要花费相当多的时间来缩小最初在更大的应用程序中观察到的这个问题.
从我在这里读到的,有一个4到8分钟的超时(SqlConnection.Close()在代码中调用之后),此时它关闭了与数据源的数据库连接.这似乎与我上面提到的方案2一致.
这使我相信它与SqlConnection使用的(以及与数据源的底层数据库连接)有关,因为在我的情况下启用了连接池,但为什么我会观察到这种行为,以及如何解决它?
我们正在使用.Net 2.0 Framework,如果这有任何区别的话.
上面列出了许多细节,如果我需要澄清任何内容,请告诉我.
唯一存在任何相似之处的Stack …
我为视图中使用的查询创建了两个选项,这些选项返回我需要的结果。我需要重写任一选项,以便可以在索引视图中使用它。在视图上创建唯一的聚集索引时,两者均失败。第一个由于LEFT OUTER JOIN而失败,第二个由于子查询而失败。我相信两者都会由于自我加入而失败。
找到“ 创建索引视图”之后,有一大堆无法使用的TSQL语法元素。其中:派生表,UNION,EXCEPT,INTERSECT,子查询,外部或自我联接,TOP,ORDER BY,DISTINCT,MAX ...
CompanyID对于每个唯一查询,查询都应为最大Company。将StatusName在Statuses表还需要显示,而我只补充说,在情况下,它会影响解决方案。当前是INNER JOIN,因此创建索引不会引起问题。
该Companies表的示例,所有3列均为INT:
CompanyID Company Revision
1 1 1
2 1 2
3 2 1
4 2 2
Run Code Online (Sandbox Code Playgroud)
查询应返回:
CompanyID Company Revision
2 1 2
4 2 2
Run Code Online (Sandbox Code Playgroud)
这是我创建的两个选项:
SELECT t1.CompanyID, t1.Company, t1.Revision, Statuses.StatusName
FROM dbo.Companies AS t1
LEFT OUTER JOIN dbo.Companies AS t2
ON t1.Company = t2.Company AND t1.CompanyID < t2.CompanyID
INNER JOIN dbo.Statuses …Run Code Online (Sandbox Code Playgroud)