Nel mio codice, ho usato per caricare un'entità correlata usando await FindAsync
, sperando che mi adeguassi meglio alle linee guida C# async.FindAsync è lento, ma il caricamento lento è veloce
var activeTemplate = await exec.DbContext
.FormTemplates.FindAsync(exec.Form.ActiveTemplateId);
e funzionava lentamente, era lento nel profiler server SQL, il testo della query era veloce in SSMS. Ci sono voluti 5 secondi per recuperare questa linea.
L'alternativa:
var activeTemplate = exec.Form.ActiveTemplate;
è molto più veloce. Il problema non sembra essere lo sniffing dei parametri, poiché il numero di letture nelle query veloci e lente è lo stesso.
Un punto potenzialmente irrilevante è che l'oggetto recuperato contiene una proprietà stringa contenente ~ 1 MB di testo. L'applicazione è asp.net mvc, in esecuzione sullo stesso computer del server SQL, che si collega usando (locale).
Qual è la causa della lentezza osservata?
EDIT: Dopo @ JBL commento, ho fatto alcuni altri esperimenti:
var activeTemplate = await exec.DbContext.FormTemplates
.FirstOrDefaultAsync(x => x.Id == exec.Form.ActiveTemplateId); // slow
var activeTemplate = exec.DbContext.FormTemplates
.FirstOrDefault(x => x.Id == exec.Form.ActiveTemplateId); // fast
questo dovrebbe aiutare http://stackoverflow.com/a/11688189/1236044 – jbl
Grazie, stranamente, Thies non è la risposta: si prega vedere la modifica – Alireza
Vedere la risposta qui, potrebbe essere il tuo caso: http://stackoverflow.com/questions/28543293/entity-framework-async-operation-takes-ten-times-as-long-to-completo –