【问题标题】:A 5sec SP hitting a 30sec timeout through LINQ-to-SQL5 秒 SP 通过 LINQ-to-SQL 达到 30 秒超时
【发布时间】:2011-08-08 18:15:11
【问题描述】:

我有一个通过 SSMS 在 5 秒内执行的 SP

当通过 LINQ-to-SQL excel 加载项执行同一个 SP 时,它会在 30 秒后超时(对同一个 SP 的简单查询需要很长时间,但会返回结果)

然后我更改了 SP,以便将所有输入参数重新分配给 SP 内的新本地参数。这使得 SP 在 SSMS 中运行时间为 36 秒(所以这就是为什么 SSMS 开始如此之快的原因)

所以我猜 SQL 服务器没有对我的 LINQ-to-SQL 查询使用参数嗅探?

所以,我的问题是,有什么方法可以让 SP 在 LINQ-to-SQL 中的速度与在 SSMS 中一样快(通过它的参数嗅探)

【问题讨论】:

  • 我假设您已经看过一些显而易见的事情,例如确保您的 LINQ-to-SQL 指向正确的服务器,并且您正在测试 SSMS 和 LINQ 中的相同参数...当您的 proc正在运行,当您运行 sp_who2 时,您看到的 spid 是什么?是不是被屏蔽了?
  • 我会使用分析器并检查这两种情况(SSMS 和 Linq2SQL)的执行计划,也许你能找到差异。如果在这两种情况下,参数都相同,等等。不应该有区别。如果参数不同,SQLServer 可能有一个错误的执行计划。但没有更多细节就很难说。

标签: sql linq-to-sql stored-procedures timeout


【解决方案1】:

无论您是从 SSMS 还是从 LINQ 调用存储过程,SQL Server 都以相同的方式优化存储过程。但它确实使用计划缓存。存储计划以供以后使用相同的登录 + ansi 设置重复使用。传入的第一个值可以确定计划的外观。如果不同的登录名/设置以不同的值开头,则可能会导致不同的缓存计划。这是对 LINQ 和 SSMS 之间性能差异的一种解释。

要重置所有缓存的计划,请使用:

DBCC FREEPROCCACHE

为了使 SP 精确地针对您调用的值进行优化,您可以使用 with recompile

create procedure dbo.MySP with recompile as ...

这会导致为每次调用编译过程。这将否定参数化。

(你的情况很不寻常。SQL Server 有force parameterization 的选项,但没有阻止它的选项。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-14
    • 1970-01-01
    • 2021-08-25
    • 1970-01-01
    • 1970-01-01
    • 2023-02-06
    • 1970-01-01
    • 2021-07-11
    相关资源
    最近更新 更多