2010-06-10 10 views
5

En base a esta pregunta: ¿ What is difference between Where and Join in linq?LINQ - Usando where o join - ¿Diferencia de rendimiento?

Mi pregunta es siguiente:

¿Hay una diferencia de rendimiento en las dos afirmaciones siguientes:

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 }; 

y

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 }; 

lo haría siempre use el segundo porque es más claro.

Mi pregunta es ahora, ¿es la primera más lenta que la segunda? ¿Construye un producto cartesic y lo filtra después con las cláusulas where?

Gracias.

Respuesta

3

Todo depende del proveedor que esté utilizando.

Con LINQ to Objects, construirá completamente el producto cartesiano y filtrará después.

Para proveedores de consulta fuera de proceso, como LINQ to SQL, depende de si es lo suficientemente inteligente como para darse cuenta de que puede traducirlo a una combinación de SQL. Incluso si LINQ to SQL no lo hace, es probable que el motor de consulta que realmente realiza la consulta lo haga; deberá verificar con la herramienta de plan de consulta relevante de su base de datos para ver qué sucederá en realidad.


nota lateral: múltiple "de" cláusulas no siempre resultan en un producto cartesiano - el contenido de un "de" puede depender del elemento actual de los anteriores, por ejemplo,

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

Muy buena respuesta, y con el uso se une el rendimiento debería ser mejor? – kamahl

+0

@Patrick: el rendimiento dependerá de la situación exacta. Si LINQ to SQL lo convierte en el mismo SQL, obviamente eso no hará la diferencia. Pero sí, generalmente un join * debería * tener un mejor rendimiento. Estoy seguro de que hay casos excepcionales en los que no lo haría :) –

1

Mi pregunta es ahora, es el primero más lento que el segundo? ¿Construye un producto cartesic y lo filtra después con las cláusulas where?

Si las colecciones están en la memoria, , entonces sí. No existe un optimizador de consultas para LinqToObjects; simplemente hace lo que el programador pregunta en el orden en que se solicita.

Si las colecciones están en una base de datos (que se sospecha debido a la variable myDB), , entonces no. La consulta se traduce a SQL y se envía a la base de datos donde hay un optimizador de consultas. Este optimizador generará un plan de ejecución. Dado que ambas consultas piden el mismo resultado lógico, es razonable esperar que se genere el mismo plan eficiente para ambas. La única manera de estar seguros de que son

  • inspeccionar planea la ejecución
  • o medir la IO (SET STATISTICS IO ON).

¿Existe una diferencia de rendimiento

Si usted se encuentra en un escenario en el que tiene que pedir, usted debe cultivar herramientas para medir y descubrir la verdad por sí mismo. Mida - no pregunte.