当我们从ASP.NET调用SP时,需要5秒钟.
当我们从sql Management Studio调用它(仅使用EXEC)时,需要0.05秒.
我们已经以许多不同的方式和情况测试了这一行为.
这是与C#.NET.数据库是MS sql Server 2012.
问题是一个网络应用程序,但是我们写了一个小的控制台应用程序作为测试工具,行为是一样的.
1)我们计算C#.NET控制台应用程序中经过的时间,如下所示:
stopwatch.Start(); rdr = cmd.ExecuteReader(); stopwatch.Stop();
2)我们通过在查询之前和之后调用GETDATE()来计算sql过程中的经过时间,然后将这些时间存储在一个小表中.我们可以在sql Mgmt Studio中查询该表,查看SP中查询的时间.
这样我们可以看到在sql与整体上花费了多少时间,其中99%用于sql.
解决方法
使用默认设置,SSMS和ADO.NET中的一切都是相同的,ARITHABORT除外.这在ADO.NET和SSMS中设置为OFF,因此要获得与您在SSMS中设置ARITHABORT OFF的应用程序相同的缓存查询计划.现在您应该看到SSMS中与应用程序的调用相同的性能.查看更多背景信息在这个漂亮的博文:http://www.sommarskog.se/query-plan-mysteries.html
如果您的查询返回大量数据,则还有另一个因素,因为每个默认SSMS读取所有数据并在完成并显示总查询时间之前显示该数据.读取速度取决于您在本地在服务器或远程上执行SSMS的位置.在远程的情况下,数据必须通过网络传输,通常比本地呼叫慢.通常,测量传输时间是OK,因为您的应用程序执行相同.但是,SSMS也会显示数据,并且比实际加载时间要长得多.为防止这种情况,您可以通过“工具 – >选项 – >查询结果 – > sql Server->结果到网格 – >删除执行结果后,禁用SSMS中的数据显示.
如果仍然有不同的行为,请通过sql Profiler捕获执行计划并进行比较.