高成本 SQL 在 SQL 服务器中使用参数进行测试时显示成本低

High cost SQL shows low cost when testing with parameters in SQL Server

我的 activity 监视器显示此高成本查询低于 运行,没有 DivisionPoolId 的值且 运行 的高成本查询。我用真实的 DivisionPoolId 测试了一下,成本很低。我不明白为什么一个的成本显示高而另一个的成本却不高,但是您可以看到执行计划由于某种原因对于相同的查询是不同的。

这个 SQL 也是从 Entity Framework 创建的。

低成本:

SELECT 
    [Distinct1].[DivisionGameTeamResultId] AS [DivisionGameTeamResultId]
FROM 
    (SELECT DISTINCT 
         [Extent1].[DivisionGameTeamResultId] AS [DivisionGameTeamResultId]
     FROM 
         [Test].[DivisionBracketParticipant] AS [Extent1]
     LEFT OUTER JOIN 
         [Test].[DivisionBracketParticipantPool] AS [Extent2] ON [Extent1].[Id] = [Extent2].[Id]
     WHERE  
         ([Extent2].[DivisionPoolId] = 124396) 
         OR (([Extent2].[DivisionPoolId] IS NULL) AND (124396 IS NULL)))  AS [Distinct1]

高成本(Activity 监控昂贵的查询):

SELECT 
    [Distinct1].[DivisionGameTeamResultId] AS [DivisionGameTeamResultId]
FROM 
    (SELECT DISTINCT 
         [Extent1].[DivisionGameTeamResultId] AS [DivisionGameTeamResultId]
     FROM  
         [Test].[DivisionBracketParticipant] AS [Extent1]
     LEFT OUTER JOIN 
         [Test].[DivisionBracketParticipantPool] AS [Extent2] ON [Extent1].[Id] = [Extent2].[Id]
     WHERE 
         ([Extent2].[DivisionPoolId] = @p__linq__0) 
         OR (([Extent2].[DivisionPoolId] IS NULL) AND (@p__linq__0 IS NULL)))  AS [Distinct1]

我将按照下面的答案创建一个拦截器以将 with 选项(重新编译)添加到查询中。

EF 6 Parameter Sniffing