一个5秒的SP通过LINQ-to-SQL达到30秒的超时

gum*_*mih 2 sql stored-procedures timeout linq-to-sql

我有一个通过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中一样快(使用它的参数嗅探)

And*_*mar 5

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

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

DBCC FREEPROCCACHE
Run Code Online (Sandbox Code Playgroud)

为了使SP针对您正在调用的值进行优化,您可以使用with recompile:

create procedure dbo.MySP with recompile as ...
Run Code Online (Sandbox Code Playgroud)

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

(你的情况很不寻常.SQL Server有一个强制参数化的选项,但是没有选项来阻止它.)