Sql server 使用XML参数进行参数嗅探

Sql server 使用XML参数进行参数嗅探,sql-server,tsql,Sql Server,Tsql,我目前正在尝试解决一个问题,即为我的一个存储过程非确定性地缓存一个错误的查询计划。很多资料表明,这类问题可能是由参数嗅探引起的,但我不确定我的案例是否适用 具体来说,我有一个XML类型的参数,在存储过程中要做的第一件事就是将其加载到临时表中。这是否会受到参数嗅探的影响 复制是耗时的,正如我所说的,是不确定的,这就是为什么我还没有检查的原因。我不知道你所说的计划是不确定的缓存,因为执行计划可以是兑现的,也可以是不兑现的。 服务器使用参数嗅探,根据在某些情况下使用的参数值,找出最有效的执行计划。粗略

我目前正在尝试解决一个问题,即为我的一个存储过程非确定性地缓存一个错误的查询计划。很多资料表明,这类问题可能是由参数嗅探引起的,但我不确定我的案例是否适用

具体来说,我有一个XML类型的参数,在存储过程中要做的第一件事就是将其加载到临时表中。这是否会受到参数嗅探的影响


复制是耗时的,正如我所说的,是不确定的,这就是为什么我还没有检查的原因。我不知道你所说的计划是不确定的缓存,因为执行计划可以是兑现的,也可以是不兑现的。 服务器使用参数嗅探,根据在某些情况下使用的参数值,找出最有效的执行计划。粗略地说,通过参数嗅探,SQLServer决定使用某种索引是否有效。例如,你可以阅读更多关于它的信息

因此,回答您的问题,因为您在某些情况下不使用xml参数,而只是将其加载到临时表中,所以执行计划不会受到参数嗅探的影响

但是,只要使用临时表,执行计划在大多数情况下都不会兑现,每次执行时都会重新编译。如果你想将计划兑现,请考虑使用表变量。
希望这有帮助

这是一个愚蠢的问题:表stats的样本量太小,太大了。我们大大增加了样本量,一切都恢复了正常。

我的意思是,缓存错误查询计划的条件是不确定的,即运行相同形状和数量的查询只会在大约%的时间内生成错误查询计划。我不明白你所说的每次执行都重新编译计划是什么意思——它确实会被缓存,这就是我的问题,它会生成不同的计划并缓存错误的计划。@RichardPianka现在我看到了你的问题,但如果没有看到SP的代码和执行计划的好坏,很难说是什么原因。你能提供吗?另外,如果SP不经常执行,并且2毫秒的重新编译时间无关紧要,那么您可以使用重新编译选项。不幸的是,我实际上无法向您展示代码。我也尝试过与重新编译一起使用,但是在许多后续调用的执行时间小于重新编译本身的情况下,会有相当大的性能损失3-4倍。所以基本上,我不能承担每次重新编译的额外费用。