我有一个存储过程(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
发生了什么事?
编辑我已经尝试了一些查询优化器提示,它们不起作用。在建议的重复问题中包括一个。它几乎就像糟糕的计划(慢计划),就估计的行数来说是正确的。快速计划对行数的估计不正确。
答案 0 :(得分:0)
TVP没有分发统计信息,但他们确实有基数信息。
参数嗅探适用于表值参数:优化器可能会在以下多行TVP上调用SP时重用为低基数TVP编译的计划。
来源: