【问题标题】:LINQ - Using where or join - Performance difference?LINQ - 使用 where 或 join - 性能差异?
【发布时间】:2010-06-10 12:02:23
【问题描述】:

基于这个问题: What is difference between Where and Join in linq?

我的问题如下:

以下两个语句是否存在性能差异:

from order in myDB.OrdersSet
    from person in myDB.PersonSet
    from product in myDB.ProductSet
    where order.Persons_Id==person.Id && order.Products_Id==product.Id
    select new { order.Id, person.Name, person.SurName,  product.Model,UrunAdı=product.Name };

from order in myDB.OrdersSet
    join person in myDB.PersonSet on order.Persons_Id equals person.Id
    join product in myDB.ProductSet on order.Products_Id equals product.Id
    select new { order.Id, person.Name, person.SurName,  product.Model,UrunAdı=product.Name };

我总是使用第二个,因为它更清晰。

我现在的问题是,第一个比第二个慢吗? 它是否构建了一个笛卡尔积并在之后使用 where 子句对其进行过滤?

谢谢。

【问题讨论】:

    标签: linq


    【解决方案1】:

    这完全取决于您使用的提供商。

    使用 LINQ to Objects,它绝对会构建笛卡尔积并在之后进行过滤。

    对于诸如 LINQ to SQL 之类的进程外查询提供程序,这取决于它是否足够聪明地意识到它可以将其转换为 SQL 连接。即使 LINQ to SQL 没有,实际执行查询的查询引擎也可能会这样做 - 您必须使用数据库的相关查询计划工具来查看实际会发生什么。


    旁注:多个“from”子句并不总是产生笛卡尔积 - 一个“from”的内容可能取决于先前的当前元素,例如

    from file in files
    from line in ReadLines(file)
    ...
    

    【讨论】:

    • 很好的答案,使用连接性能应该更好?
    • @Patrick:性能将取决于具体情况。如果 LINQ to SQL 将其转换为相同的 SQL,那么显然不会有什么不同。但是,是的,通常连接应该表现更好。我敢肯定,在某些特殊情况下不会:)
    【解决方案2】:

    我现在的问题是,第一个比第二个慢吗?它是否构建了一个笛卡尔积并在之后使用 where 子句对其进行过滤?

    如果集合在内存中,那么是。 LinqToObjects 没有查询优化器——它只是按照程序员提出的要求做的事情。

    如果集合在数据库中(怀疑是由于 myDB 变量),那么没有。查询被翻译成 sql 并发送到有查询优化器的数据库。这个优化器会生成一个执行计划。由于两个查询都要求相同的逻辑结果,因此可以合理地预期将为两者生成相同的有效计划。唯一可以确定的方法是

    • 检查执行计划
    • 或测量 IO(SET STATISTICS IO ON)。

    是否有性能差异

    如果您发现自己处于必须询问的情况,您应该培养工具来衡量和发现自己的真相。衡量 - 不要问。

    【讨论】:

      猜你喜欢
      • 2012-06-06
      • 1970-01-01
      • 2016-09-07
      • 2012-01-03
      • 2013-08-07
      • 2011-08-08
      • 1970-01-01
      • 2021-12-06
      • 2016-03-16
      相关资源
      最近更新 更多