C# 从ASP.NET调用存储过程比从SQL管理调用存储过程慢

C# 从ASP.NET调用存储过程比从SQL管理调用存储过程慢,c#,sql-server,performance,C#,Sql Server,Performance,我们正在尝试诊断复杂存储过程中的慢度(它有两个巨大的查询) 从ASP.NET调用SP时,需要5秒钟 当我们从SQLManagementStudio(仅使用EXEC)调用它时,需要0.05秒 我们已经在许多不同的方式和环境中对这种行为进行了一致的测试 这是用C#NET编写的。数据库是MS SQL Server 2012 问题在于web应用程序,但我们编写了一个小型控制台应用程序作为测试工具,其行为是相同的 1) 我们在C#.NET控制台应用程序中计算运行时间,如下所示: stopwatch.Sta

我们正在尝试诊断复杂存储过程中的慢度(它有两个巨大的查询)

从ASP.NET调用SP时,需要5秒钟

当我们从SQLManagementStudio(仅使用EXEC)调用它时,需要0.05秒

我们已经在许多不同的方式和环境中对这种行为进行了一致的测试

这是用C#NET编写的。数据库是MS SQL Server 2012

问题在于web应用程序,但我们编写了一个小型控制台应用程序作为测试工具,其行为是相同的

1) 我们在C#.NET控制台应用程序中计算运行时间,如下所示:

stopwatch.Start();
rdr = cmd.ExecuteReader();
stopwatch.Stop();
2) 我们通过在查询前后调用GETDATE()来计算SQL过程中经过的时间,然后将这些时间存储在一个小表中。我们可以在SQL Mgmt Studio中查询该表,以查看SP内的查询花费了多长时间

通过这种方式,我们可以看到与整个SQL相比,在SQL中花费了多少时间,99%的时间是在SQL中花费的

但是,如果在SQLMGMTStudio中速度不慢,就很难进行调试和改进


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

我去年也有类似的问题。尝试在存储过程中启用arithaport:

摘自

SQL Server Management Studio的默认arithaport设置为启用。将ARITHABORT设置为OFF的客户端应用程序可能会收到不同的查询计划,这使得对性能差的查询进行故障排除变得困难也就是说,同一查询在management studio中执行得很快,但在应用程序中执行得很慢。使用management studio对查询进行故障排除时,始终与客户端arithaport设置相匹配


这种行为通常源于这样一个事实,即您从ADO.NET和SSMS获得不同的执行计划。这是因为执行计划不仅必须考虑SQL本身,还必须考虑ANSI_null、ARITHABORT和其他一些设置形式的上下文。因此,如果这些设置不相同,则一个环境中的执行计划不能在另一个环境中使用

在默认设置下,SSMS和ADO.NET中的所有内容都是相同的,除了ARITHABORT。这在ADO.NET中设置为OFF,在SSMS中设置为ON,因此要获得与应用程序相同的缓存查询计划,需要在SSMS中设置ARITHABORT OFF。现在,您应该可以在SSMS中看到与应用程序调用相同的性能。在这篇精彩的博文中查看更多背景信息:

如果查询返回大量数据,还有另一个因素,因为默认情况下,SSMS读取所有数据并在完成和显示总查询时间之前显示。它读取它的速度取决于您在服务器本地或远程执行SSM的位置。在远程情况下,数据必须通过网络传输,这通常比本地呼叫慢。通常情况下,测量传输时间是可以的,因为您的应用程序也会这样做。但是,SSMS也会显示数据,这可能比实际加载数据花费更长的时间。为了防止这种情况,您可以通过“工具->选项->查询结果->SQL Server->结果到网格->执行后丢弃结果”禁用SSMS中的数据显示


如果您仍然获得不同的行为,请通过SQL Profiler捕获执行计划并进行比较。

第一件要做的事情可能是比较执行计划。您是否正在使用记录?当您只执行reader而不提取记录时,sql server将等待“接收确认”。循环到读卡器的末尾,然后检查您是否仍然存在问题。仅供参考,这与锁定有关的可能性非常小。@MartinSmith是的,但是参数嗅探在这个问题描述中非常常见(无论如何,在论坛上),您可以始终回答“参数嗅探”你90-95%的时间都是对的。我会看看这个设置。如果没有其他因素的话,我们肯定可以消除这个因素,所以谢谢你。至于“返回的数据”问题,我们不考虑SSM传输/显示数据所需的时间。我们将存储过程本身的前后时间戳插入到一个单独的表中,该时间戳夹在巨大的SELECT查询周围。这是我们考虑的时间,而不是SSMS报告的时间。我会继续接受这个答案,因为比较执行计划最终会得出答案,这对未来的案例也很有用。谢谢