加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 17:49:52 所属栏目:百科 来源:网络整理
导读:我们正在尝试在复杂的存储过程中诊断慢(它有几个巨大的查询). 当我们从ASP.NET调用SP时,需要5秒钟. 当我们从SQL Management Studio调用它(仅使用EXEC)时,需要0.05秒. 我们已经以许多不同的方式和情况测试了这一行为. 这是与C#.NET.数据库是MS SQL Server 201
我们正在尝试在复杂的存储过程中诊断慢(它有几个巨大的查询).

当我们从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捕获执行计划并进行比较.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读