2010-01-15 17 views
7

Ho una query sulla mia pagina che impiega almeno mezzo secondo per eseguire utilizzando EF 3.5. Quando ho usato una procedura memorizzata, la velocità era notevolmente più veloce. È una query molto complessa. Ci saranno miglioramenti delle prestazioni nel prossimo EF 4.0? E EF 4.0 ha davvero battuto 3,5 prestazioni?In che modo le prestazioni dell'entità framework 4 vs entity framework 3.5?

+1

In una domanda a parte hai visto le differenze nel piano di esecuzione tra la stored procedure e quella generata da EF 3.5? – Kane

risposta

3

La risposta breve è troppo presto per dirlo. I ragazzi di .Net si stanno concentrando quasi esclusivamente sulle prestazioni fino a quando l'uscita del 12 aprile non sarà finalizzata e localizzata. Inoltre, cosa si intende per più veloce? Più veloce possono essere visualizzati in molti modi, ad esempio:

  • Entity Framework 4.0 has new features, solo i miglioramenti oggetto di monitoraggio può significare enormi vittorie visto che non stai facendo che più veloce il lavoro manuale da soli ... in ogni caso, almeno del sviluppo .
  • Se non ha funzionato prima, gli oggetti più leggeri con POCOsupport possono significare che molta meno memoria viene spostata quando si ha a che fare con molti oggetti. Non importa quanto piccolo sia il costo delle proprietà aggiuntive che vengono popolate durante il recupero dal DB, vi è un costo sia nell'istanziazione che nel loro monitoraggio (tempo di caricamento e consumo di memoria).

Nel tuo caso specifico, un mezzo secondo è un lungo tempoper qualsiasi cosa, ma una query di volume molto complesso o ad alta ... hai guardato per vedere quanto tempo viene speso nel database e quanto tempo viene speso una volta .Net ha i dati? Se passi la maggior parte del tuo tempo fuori da SQL allora sì, i miglioramenti di base nelle riflessioni in Net 4.0 dovrebbero darti dei miglioramenti di velocità ... tuttavia se passi tutto il tuo tempo in SQL, non sarà di grande aiuto affatto. La maggior parte del tuo problema di prestazioni potrebbe essere l'indicizzazione delle prestazioni di idratazione generate da SQL e non da Entity Framework.

avrei seguito il commento di Kane, guardare lo SQL sta generando per la tua ricerca, è possibile per voi di questo post e la stored procedure che è rapido in modo che possiamo forse trovare dove sta il problema?

1

Dalle ADO.NET blog:

Personalizzazione Richieste - Aggiunta del supporto per gli operatori LINQ esistenti, riconoscere un ampio insieme di modelli con LINQ, crei modello definito funzioni insieme alla capacità di utilizzare questi in LINQ e un numero di altri modi per creare e personalizzare le query .

SQL Generation Leggibilità Miglioramenti - Migliorare la leggibilità, insieme con TSQL ottimizzazioni delle prestazioni, dei query generati per rendere molto più facile da capire che cosa sta accadendo

Quindi questi due punti implicare si potrebbe vedere i miglioramenti nel modo in cui genera la query da LINQ.

Tuttavia è improbabile che un ORM sarà mai in grado di superare una query che hai scritto da zero in quanto deve soddisfare così tanti diversi scenari, e di solito il più comune è quello predefinito. EF 3.5 sembrava produrre un join SQL molto efficiente quando lo usavo, probabilmente il migliore che ho visto da un ORM quindi c'è speranza che tu possa sbarazzarti dell'SP in 4.0.

Se si dispone di una stored procedure, suppongo che si tratti di una query di grandi dimensioni: l'invio di questo testo SQL ogni volta al server causerà molto traffico di rete, che è un'altra cosa che si può o non si è potuto prendere in considerazione. Ovviamente sullo stesso server o all'interno della stessa rete interna si tratta di un'ottimizzazione dello stile di 'tagliare i capelli per perdere peso'.

0

Quando si tratta di query veramente complesse, non ho visto alcuna evidenza che nessuna L2S, NH o EF possa generare un piano di query migliore di quello che posso in un sproc. Adoro gli ORM (in particolare l'NH), ma ci sono ancora dei casi in cui il tempo di esecuzione dell'ORM può essere compensato da uno sproc scritto bene.