高成本 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
我的 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