gpt4 book ai didi

c# - 从 ASP.NET 与 SQL Mgmt Admin 调用时存储过程速度较慢

转载 作者:可可西里 更新时间:2023-11-01 08:41:24 25 4
gpt4 key购买 nike

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

当我们从 ASP.NET 调用 SP 时,需要 5 秒。

当我们从 SQL Management Studio 调用它时(仅使用 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 上花费了多少时间与整体相比,99% 的时间都花在了 SQL 上。

但如果它在 SQL Mgmt Studio 中不是也很慢,则很难调试和改进。

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

最佳答案

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

在默认设置下,SSMS 和 ADO.NET 中的一切都相同,除了 ARITHABORT。这在 ADO.NET 中设置为 OFF,在 SSMS 中设置为 ON,因此要获得与您的应用程序相同的缓存查询计划,您需要在 SSMS 中将 ARITHABORT 设置为 OFF。现在,您应该会在 SSMS 中看到与应用程序调用相同的性能。在这篇不错的博客文章中查看更多背景信息:http://www.sommarskog.se/query-plan-mysteries.html

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

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

关于c# - 从 ASP.NET 与 SQL Mgmt Admin 调用时存储过程速度较慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17364487/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com