La tua "prima esecuzione" scenario è, generalmente, la one-off di inizializzazione statica della DbContext. Questo è dove il DbContext funziona il mapping per la prima volta e si verifica quando la prima query viene eseguita. L'approccio tipico per evitare che questo si verifichi per un utente è quello di avere un semplice "warm up" query che viene eseguita quando il servizio viene avviato.. Per esempio dopo che il vostro servizio inizializza, basta mettere qualcosa di simile al seguente:
// Warm up the DbContext
using (var context = new AppDbContext())
{
var hasUser = context.Users.Any();
}
Questo serve anche come un rapido avviamento verificare che il database è raggiungibile e di rispondere. La query stessa di fare un'operazione rapidissima, ma il DbContext risolverà il mapping in questo momento appena generato DbContext istanze di rispondere senza incorrere in un costo che durante una richiesta.
Come per le prime prestazioni, se non è una query che dovrebbe prendere un po', e legare una richiesta, non rendono async
. Le richieste asincrone sono non più veloce, in realtà sono un po ' più lento. Utilizzando async
le richieste contro il DbContext è garantire il vostro web server / application thread è reattiva mentre potenzialmente costose operazioni di database sono in corso di elaborazione. Se si desidera una risposta il più rapidamente possibile, utilizzare una chiamata sincrona.
Successivamente, di verificare che tutti i campi che si sta filtrando contro, in questo caso Valuta, sono indicizzati. Avere un campo chiamato la Valuta del tuo entità come una Stringa piuttosto che un CurrencyId FK (int
) indicando una Valuta è già record di un extra di indicizzazione spese con indici in numeri interi sono più piccolo/più veloce rispetto a quelli di stringhe.
Inoltre, non c'è bisogno di preoccuparsi con AsNoTracking
quando si utilizza un Count
query. AsNoTracking
si applica esclusivamente quando si è di tornare entità (ToList
/ToArray
/Single
/First
ecc.) per evitare di avere il DbContext trattenendo un riferimento al restituito entità. Quando si utilizza Count
/Any
o proiezione di ritorno proprietà da entità utilizzando Select
non c'è nessuna entità restituito alla pista.
Anche prendere in considerazione la latenza di rete, tra cui il codice dell'applicazione è in esecuzione e il server di database. Sono la stessa macchina o c'è una connessione di rete in gioco? Come si può confrontare quando si esegue una query di sql server management studio? Utilizzando un profiler è possibile vedere quali SQL EF è in realtà l'invio al database. Tutto il resto in termini di tempo è un costo di: Ottenere la richiesta al DB, Ottenendo la risultante dati del richiedente, l'analisi di tale risposta. (Se nel caso in cui si sta tornando entità, l'assegnazione, la compilazione, il controllo contro riferimenti esistenti, ecc... Nel caso di conti etc. controllare i riferimenti esistenti)
Infine, per garantire che si sta ottenendo il massimo delle prestazioni, garantire che il vostro DbContexts vite sono tenuti corti. Se DbContext è tenuta aperta e che ha avuto un numero di tracking eseguire query in (Selezione di entità senza AsNoTracking
) quelli monitorati i riferimenti a entità che si accumulano e possono avere un impatto negativo sulle prestazioni future query, anche se si utilizza AsNoTracking
come EF cerca di controllare, attraverso di esso, tracciati riferimenti per le entità che potrebbero essere applicabili e/o connesse alla nuova query. Molte volte vedo gli sviluppatori di assumere DbContexts sono "costosi", così si opta per creare un'istanza di loro il meno possibile per evitare tali costi, solo per finire di fare le operazioni più costoso.
Con tutto considerato, EF non sarà mai veloce come materie prime SQL. Si tratta di un ORM progettato per fornire la convenienza per .Net applications quando si tratta di lavorare con i dati. Che comodità nel lavoro con le classi di entità piuttosto che sanificazione e di scrivere la propria raw SQL ogni volta che viene fornito con un costo.