我要调试源的SQL超时在网应用程序,我维持。我有源代码C#代码隐藏,所以我知道到底是什么代码是否正在运行。我已经试的应用程序的行执行SQL代码时,我看运行查询在SQL分析器。

当这个执行查询的网站,这次出后的30秒钟。然而,当我剪贴查询,正是因为呈现中的探查,而我把它放到短程和运行,它返回几乎瞬间。我们追踪的问题ARITHABORT被设置为关于连接,该网站是使用(即,如果我把ARITHABORT在短程届会议,运行时间长,而且如果我把它背上那么它的运行速度很快).然而,阅读本说明的ARITHABORT,它似乎并不适用于...我只是做一个简单的选择,并没有算术正在执行的所有..只是一个单一的内加入一个条件:

为什么会ARITHABORT关能会导致这种行为在这种背景下??是否有任何种方式我可以改变ARITHABORT设置这方面,从短程?我使用的SQL服务器2008年。

有帮助吗?

解决方案

那么您的 C# 代码使用什么方法向 SQL Server 发送即席 SQL 查询?您是否考虑过使用存储过程?无论谁调用它,这都可能确保相同的性能(至少在引擎中)。

为什么?ARITHABORT 设置是优化器在确定如何执行查询(更具体地说,用于计划匹配)时查看的内容之一。缓存中的计划可能与 SSMS 具有相同的设置,因此它使用缓存的计划,但使用相反的设置,您的 C# 代码将强制重新编译(或者您可能遇到了真正的问题) 坏的 缓存中的计划),这在很多情况下肯定会损害性能。

如果您已经在调用存储过程(您没有发布查询,尽管我认为您有意这样做),则可以尝试将 OPTION (RECOMPILE) 添加到存储过程中的违规查询(或多个查询)。这意味着这些语句将始终重新编译,但它可以防止使用您似乎遇到的错误计划。另一种选择是确保在编译存储过程时,使用 SET ARITHABORT ON 执行批处理。

最后,您似乎在问如何更改 SSMS 中的 ARITHABORT 设置。我认为您想问的是如何在代码中强制执行 ARITHABORT 设置。如果您决定继续从 C# 应用程序发送即席 SQL,那么您当然可以以文本形式发送命令,其中包含多个用分号分隔的语句,例如:

SET ARITHABORT ON; SELECT ...

有关出现此问题的原因的更多信息,请参阅 Erland Sommarskog 的精彩文章:

其他提示

这个答案 包括一种方法来解决这个问题:

通过运行以下命令作为管理数据库的所有查询按预期运行,无论ARITHABORT设置。

 DBCC DROPCLEANBUFFERS
 DBCC FREEPROCCACHE

更新

它似乎是大多数人最终具有这种问题很少发生,与上述技术是一个体面的一段时间的修复。但是,如果一个特定的查询显示出这个问题多于一次,一项更长期的解决这个问题将使用的查询提示喜欢 OPTIMIZE FOROPTION(Recompile), ,作为描述 这篇文章.

我已经很多次了这个问题,但如果你有同样的问题,删除并重新创建存储过程将解决问题的存储过程。

这就是所谓的参数嗅探。 你需要始终定位在存储过程中的参数,以避免在未来的这个问题。

我理解这可能不是楼主想要的东西,但可能帮助别人有同样的问题。

如果使用实体框架,您必须注意,默认情况下,字符串值的查询参数以 nvarchar 形式发送到数据库,如果要比较的数据库列类型为 varchar,则根据您的排序规则,查询执行计划可能需要“隐式转换”步骤,即强制进行全面扫描。我可以通过查看昂贵查询选项中的数据库监控来确认这一点,该选项显示执行计划。

最后,本文对这种行为进行了解释:https://www.sqlskills.com/blogs/jonathan/implicit-conversions-that-c​​ause-index-scans/

我有同样的问题,这是通过执行程序“WITH RECOMPILE”固定的。您也可以尝试使用参数嗅探。我的问题是有关SQL缓存。

如果你可以改变你的代码来解决参数嗅探优化未知的提示是你最好的选择。如果你不能改变你的代码的最佳选择是EXEC sp_recompile“PROC的名字”,这将迫使只有一个存储过程来获得一个新的执行计划。删除并重新创建一个进程也会产生类似的效果,但如果有人试图同时你必须下降到执行PROC可能会导致错误。 DBCC FREEPROCCACHE滴你所有的缓存计划能造成严重破坏确定您的系统并包括导致很多超时的一个沉重的交易生产环境。设置ARITHABORT不是解决问题的办法,但对于发现如果参数嗅探是问题的一个有用工具。

当试图从SMSS称之为SP花费2秒,而从所述web应用程序(ASP.NET)需要大约3分钟我有同样的问题。

我已经尝试了所有建议的解决方案sp_recompileDBCC FREEPROCCACHEDBCC DROPCLEANBUFFERS但没有固定我的问题,但是当试图参数嗅着它的伎俩,并且工作得很好。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top