高效的查询和执行计划

时间:2012-06-11 16:24:00

标签: tsql

我有一个简单的实体框架查询。 它使用分组:

source.GroupBy(x => x.Key)
.Select(x => x.Count(z => z.IsDefaultValue == false) > 0
    ? x.FirstOrDefault(z => z.IsDefaultValue == false)
    : x.FirstOrDefault()
);

它的执行计划如下:

Plan 1

然后我更改了查询:

source.GroupBy(x => x.Key)
.Select(x => x.Any(z => z.IsDefaultValue == false)
    ? x.FirstOrDefault(z => z.IsDefaultValue == false)
    : x.FirstOrDefault()
);

现在我使用任意而不是计数。 它的计划如下: Plan 2

我的问题是:我应该使用什么查询? 什么查询更有效?

我对执行计划一无所知:( 您在这些执行计划中看到了哪些重要信息?

编辑:请在新标签页中拖动图片,它会更具可读性。

1 个答案:

答案 0 :(得分:1)

  

我的问题是:我应该使用什么查询?什么查询更有效?

要找到答案,我只需要生成两个已生成的SQL查询(您可以在计划的xml中查看完整查询)并在一个SQL Server Management Studio查询窗口中一起运行它们, “包括实际执行计划”选项。

结果计划中的“查询成本(相对于批次)”将告诉您哪一个对您的实际架构/数据更有效。

  

EF的Any()vs Count()> 0?哪个更有效率?

一般情况下,如果你只想知道任何的“东西”是否符合你的标准,那么通常建议你使用Any()而不是Count()> 0让LINQ担心构建最有效的方法。在这个用例中,我只需检查SQL并查看。

查看this

等答案
  

仅针对IEnumerable<T>Any() 通常会更快,因为它只需要查看一次迭代。