3

我有一个存储过程 (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

到底是怎么回事?

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

4

1 回答 1

2

TVP 没有分布统计,但它们有基数信息。

参数嗅探适用于表值参数:优化器可能重用为低基数 TVP 编译的计划,然后在具有多行的 TVP 上调用 SP。

资料来源:

于 2018-04-09T17:03:25.170 回答