表值参数"嗅探"

时间:2016-06-07 15:45:23

标签: sql-server tsql parameter-sniffing

我有一个存储过程(SP),其中传入了一个表值参数(TVP).SP中相同的代码执行速度比SP外部慢得多。

我看了一下执行计划,它们非常不同。

起初,这似乎是参数嗅探的标志,但这适用于TVP!哪个方面有点不同(我不太确定 - 显然没有嘲笑TVP')。

在任何情况下,如果我创建一个新的本地TVP并将行插入其中,那么我会得到一个很好的执行计划!

CREATE PROCEDURE [dbo].[TVPSniffTest] (
    @GuidList dbo.Guid_LIST readonly
)
AS
BEGIN 
    DECLARE @GuidList2 dbo.Guid_LIST
    INSERT INTO @GuidList2 
    SELECT * FROM @GuidList

   --query code here using @GuidList2, produces a good plan!
END

发生了什么事?

编辑我已经尝试了一些查询优化器提示,它们不起作用。在建议的重复问题中包括一个。它几乎就像糟糕的计划(慢计划),就估计的行数来说是正确的。快速计划对行数的估计不正确。

1 个答案:

答案 0 :(得分:0)

TVP没有分发统计信息,但他们确实有基数信息。

参数嗅探适用于表值参数:优化器可能会在以下多行TVP上调用SP时重用为低基数TVP编译的计划。

来源:

相关问题