【问题标题】:Performance Question between two Linq Queries in LinqPad and in PracticeLinqPad 和实践中两个 Linq 查询之间的性能问题
【发布时间】:2011-07-31 16:54:10
【问题描述】:

我有一个问题:

(from sr in ctx.STARS_Route
                            where sr.STARS_RouteStopDestination.Any(i => i.IsWorkingSet == true && i.STARS_DistrictRoute.DistrictId == districtId) == true
                            select sr.DistrictRouteNumber).Distinct();

在 LinqPad 中,查询的运行时间大约为 0.3 秒。 STARS_RouteStopDestination 表中大约有 800K 条记录,但平均返回大约 30-90 条记录。

实际上,从该查询返回结果的方法需要 4 多秒!这没有任何意义。

我唯一能想到的是 .Any 子句花费了很多时间,但 LinqPad 说查询很快。我设置了一个测试(请原谅名称):

using (STARSEntities ctx = new STARSEntities())
        {
            var Original = (from sr in ctx.STARS_Route
                            where sr.STARS_RouteStopDestination.Any(i => i.IsWorkingSet == true && i.STARS_DistrictRoute.DistrictId == districtId) == true
                            select sr.DistrictRouteNumber).Distinct();

            var Entity = (from rsd in ctx.STARS_RouteStopDestination
                          where rsd.STARS_DistrictRoute.DistrictId == districtId
                          && rsd.IsWorkingSet == true
                          select rsd.STARS_Route.DistrictRouteNumber).Distinct();

            DateTime startOriginal = DateTime.Now;
            routes = Original.ToList();
            Debug.WriteLine("Original took: " + (DateTime.Now - startOriginal).ToString());
            DateTime startEtity = DateTime.Now;
            routes = Entity.ToList();
            Debug.WriteLine("Entity took: " + (DateTime.Now - startEtity).ToString());
        }

输出让我大吃一惊:
原始拍摄时间:00:00:04.0270000
实体占用:00:00:00.0200000

为什么带有 .Any 子句的查询需要更长的时间才能运行,为什么 LinqPad 会说原始查询比针对同一数据集的实体查询运行速度略快?

【问题讨论】:

  • 如果以相反的顺序执行查询会发生什么?
  • 我更喜欢使用 System.Diagnostics 中的 StopWatch 类来测量执行时间,而不是 DateTime。
  • 反向:实体拍摄:00:00:00.0170000 原始拍摄:00:00:04.0890000
  • 如果您使用的是 LinqPad,您应该能够看到生成的 SQL。也许这可以说明一些问题。 IIRC EF 比 L2S 有更好的 SQL 生成。
  • 如果您使用的是 LINQPad 生成的模型,那么您使用的是 LINQ to SQL,它生成的 SQL 与实体框架不同(通常更好)。在任何情况下,LINQPad 的 SQL 转换选项卡都应该告诉您正在生成什么 SQL。您还可以在 LINQPad 中连接到您的 EF 模型并进行比较。

标签: linq entity-framework-4 linq-to-entities linqpad


【解决方案1】:

您只是对两个不同的对象进行操作,它们有两种不同的策略来获得结果。 LINQPad 生成一个 LINQ to SQL 模型,并将您的代码注入到具有此模型范围内的方法中。

您的 STARSEntities 类属于不同类型,可能与数据库的交互完全不同。

LINQPad 有自己的视图来显示正在运行的 SQL。您应该将其与 EF 模型正在执行的 SQL 进行比较。这会在您执行时显示在 SQL Server Profiler 中。

【讨论】:

    猜你喜欢
    • 2022-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多