c# – 从ASP.NET与SQL Mgmt Admin调用时,存储过程较慢

前端之家收集整理的这篇文章主要介绍了c# – 从ASP.NET与SQL Mgmt Admin调用时,存储过程较慢前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我们正在尝试在复杂的存储过程中诊断慢(它有几个巨大的查询).

当我们从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.

但是,如果在sql Mgmt Studio中也不是很慢,那么很难调试和改进.

所以我的问题是,为什么有区别?可能是sql Mgmt Studio的锁定方式与控制台应用程序不同?

解决方法

这种行为往往源自于您从ADO.NET和SSMS获得不同的执行计划.这是因为执行计划不仅要考虑sql本身,还要考虑ANSI_NULLS,ARITHABORT和其他几种设置的形式的上下文.因此,如果这些设置不一样,则来自一个环境的执行计划不能在另一个环境中使用.

使用默认设置,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捕获执行计划并进行比较.

猜你在找的C#相关文章