2012-08-03 101 views
1

我正在尝试解决一个问题,其中一个存储过程对于一个错误的查询计划进行了非确定性缓存。很多资源表明这种问题可能是由参数嗅探引起的,但我不确定我的情况是否适用。使用XML参数嗅探参数

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

(再现时间成本,就像我说的,不确定性的,这就是为什么我不只是检查还)

回答

0

这是一个愚蠢的问题:表统计的样本量太小(相当大的表)。我们大幅提高了样本规模,一切都再次顺利进行。

0

我不知道你执行计划的意思plan is non-determinstically cached什么都可以可以兑现或不兑现。 服务器使用参数监听来根据参数值找出最有效的执行计划,在某些情况下使用该参数值。粗略地说,使用参数sniffling sql-server决定使用某个索引是否有效。更多关于它你可以阅读,例如in this blog

因此,回答你的问题,因为你在某些条件下不使用xml参数,而只是将它加载到临时表中,执行计划不会受到参数嗅探的影响。

但是,只要您使用临时表,执行计划在大多数情况下不会兑现,并会在每次执行时重新编译。如果您希望计划兑现,请考虑使用表格变量。

希望这会有所帮助。

+0

我的意思是,缓存_bad_查询计划的条件是非确定性的(即,运行相同的形状和查询量只会在一定的时间内产生错误的查询计划)。我不明白你的计划在每次执行时都会重新编译 - 它确实得到了缓存,这就是我的问题(它产生了不同的计划并缓存了错误的计划)。 – 2012-08-04 16:41:37

+0

@RichardPianka现在我看到了你的问题,但很难说如果没有看到SP的代码和执行计划不好而且很好,可能是什么原因。你能提供他们吗?另外,如果SP不经常执行,并且2 ms用于重新编译并不重要,则可以使用RECOMPILE选项http://msdn.microsoft.com/en-us/library/ms190439.aspx – 2012-08-05 03:53:55

+0

不幸的是,我不能实际上向你展示代码。我也尝试使用WITH RECOMPILE,但在许多后续调用的执行时间少于重新编译本身的用例中,性能会有相当大的损失(3-4倍)。所以基本上,我不会每次都花费重新编译的额外成本。 – 2012-08-05 18:32:10