Sql server 为什么sp_executesql在参数方面如此缓慢?

Sql server 为什么sp_executesql在参数方面如此缓慢?,sql-server,Sql Server,我们使用sp_executesql从C#层对SQLServer2012执行了一个sql查询。下面是一个运行时的简化示例 exec sp_executesql N' select * from MyTable where MyColumn = @MyParameter ' ,N'@MyParameter int' ,@MyParameter=1 由于不完全理解的原因,此查询运行了4分钟。我们通过将所有输入参数复制到局部变量来更改查询,然后只使用查询中的变量,执行时间下降到0秒 exec sp_e

我们使用sp_executesql从C#层对SQLServer2012执行了一个sql查询。下面是一个运行时的简化示例

exec sp_executesql N'
select * from MyTable where MyColumn = @MyParameter
'
,N'@MyParameter int'
,@MyParameter=1
由于不完全理解的原因,此查询运行了4分钟。我们通过将所有输入参数复制到局部变量来更改查询,然后只使用查询中的变量,执行时间下降到0秒

exec sp_executesql N'
declare @MyVariable int = @MyParameter
select * from MyTable where MyColumn = @MyVariable
'
,N'@MyParameter int'
,@MyParameter=1

有人知道为什么会这样吗?更重要的是,在不必更改代码的情况下,可以做些什么?当然,这表明SQL Server安装有问题,可以通过修改某些数据库设置来更改。到目前为止,对于一个特定的查询,这只是一个环境中的一个问题,但我担心它会出现更多问题,因为我们有许多查询以这种方式使用参数。

您是否尝试过查看这些操作的执行计划?它可以让您了解引擎在这两种情况下的不同之处您是否立即运行它?您是否在之前清除了数据库缓存?第二个可能运行得更快,因为它已经创建了查询计划等。参数嗅探和计划缓存,请查看查询计划EP参数嗅探。请看这里: