2010-06-10 17 views
5

Sulla base di questa domanda: What is difference between Where and Join in linq?LINQ - Utilizzo di dove o unisciti - La differenza di prestazioni?

La mia domanda è la seguente:

C'è una differenza di prestazioni nei seguenti due affermazioni:

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

e

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 farei usa sempre il secondo solo perché è più chiaro.

La mia domanda è ora, è la prima più lenta della seconda? Costruisce un prodotto cartesico e lo filtra in seguito con le clausole where?

Grazie.

risposta

3

Dipende interamente dal provider che si sta utilizzando.

Con LINQ to Objects, in seguito creerà assolutamente il prodotto cartesiano e il filtro.

Per i provider di query out-of-process come LINQ to SQL, dipende dal fatto che sia abbastanza intelligente da comprendere che può tradurlo in un join SQL. Anche se LINQ to SQL non lo fa, è probabile che il motore di query che esegue effettivamente la query lo farà - dovresti verificare con lo strumento del piano di query pertinente per il tuo database per vedere cosa accadrà effettivamente.


Side-nota: multipla "da" clausole non sempre si traducono in un prodotto cartesiano - il contenuto di una "da" possono dipendere l'elemento corrente di quelle precedenti, per esempio

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

Risposta molto buona, e con l'utilizzo di join la performance dovrebbe essere migliore? – kamahl

+0

@Patrick: le prestazioni dipenderanno dalla situazione esatta. Se LINQ to SQL lo converte nello stesso SQL, ovviamente questo non farà la differenza. Ma sì, generalmente un join * dovrebbe * eseguire meglio. Sono sicuro che ci sono casi eccezionali in cui non sarebbe però :) –

1

La mia domanda è ora, è il primo più lento del secondo? Costruisce un prodotto cartesico e lo filtra in seguito con le clausole where?

Se le raccolte sono in memoria, quindi sì. Non esiste Query Optimizer per LinqToObjects: fa semplicemente ciò che il programmatore chiede nell'ordine richiesto.

Se le raccolte sono in un database (che è sospettato a causa della variabile myDB), quindi non. La query viene tradotta in SQL e inviata al database in cui è presente un ottimizzatore di query. Questo ottimizzatore genererà un piano di esecuzione. Poiché entrambe le query richiedono lo stesso risultato logico, è ragionevole aspettarsi che venga generato lo stesso piano efficiente per entrambi. Gli unici modi per essere certi devono

  • ispezionare l'esecuzione prevede
  • o misurare l'IO (SET STATISTICS IO ON).

C'è una differenza di prestazioni

Se vi trovate in uno scenario in cui si deve chiedere, si dovrebbe coltivare strumenti con cui misurare e scoprire la verità per se stessi. Misura - non chiedere.

Problemi correlati