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

此 SQL 也是从实体框架创建的。

低成本:

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]

在此输入图像描述

高成本(昂贵查询的活动监视器):

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 参数嗅探


这很可能是参数嗅探。如果with option(recompile)使用参数添加到查询中,您会看到索引查找吗?

它是实体框架,所以我不能,我需要对此查询进行更改跟踪

使用 ORM 有点像试图用膝盖来驾驶汽车,双手绑在背后 - 一般来说,如果你不需要太多驾驶就没有问题;-)。如果这不是生产系统,请尝试dbcc freeproccache先从您的应用程序运行它。

第二个查询可能使用在统计信息不同时创建的现有查询计划。通过 Sql Server 的调优顾问运行查询通常非常有启发性。

考虑选择不使用 UseRelationalNulls 模拟 C# null 比较learn.microsoft.com/en-us/dotnet/api/ ...