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

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

概述我们正在尝试在复杂的存储过程中诊断慢(它有几个巨大的查询). 当我们从ASP.NET调用SP时,需要5秒钟. 当我们从SQL Management Studio调用它(仅使用EXEC)时,需要0.05秒. 我们已经以许多不同的方式和情况测试了这一行为. 这是与C#.NET.数据库是MS SQL Server 2012. 问题是一个网络应用程序,但是我们写了一个小的控制台应用程序作为测试工具,行为是 我们正在尝试在复杂的存储过程中诊断慢(它有几个巨大的查询).

当我们从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# – 从ASP.NET与SQL Mgmt Admin调用时,存储过程较慢全部内容,希望文章能够帮你解决c# – 从ASP.NET与SQL Mgmt Admin调用时,存储过程较慢所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1237420.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存