Twój scenariusz "pierwszego uruchomienia", jak zwykle stanowi jednorazową statycznej inicjalizacji DbContext. To właśnie tutaj DbContext po raz pierwszy wykonuje swoje skojarzenia i będzie realizowana po wykonaniu pierwszego zlecenia. Typowe podejście, które pozwala uniknąć tego dla użytkownika, jest prostym zapytaniu "rozgrzaniu", który jest wykonywany podczas uruchamiania usługi.. na Przykład, po inicjalizacji twojej usługi, wystarczy wpisać coś takiego jak poniżej:
// Warm up the DbContext
using (var context = new AppDbContext())
{
var hasUser = context.Users.Any();
}
To również służy do szybkiego sprawdzenia przy starcie, że baza danych jest dostępna i jest odpowiedzialny. Sam zapytanie wykona bardzo szybką operację, ale w tym czasie DbContext rozwiąże swoje skojarzenia, więc wszelkie nowo utworzone instancje DbContext będą odpowiadać bez żadnych kosztów podczas kwerendy.
Co do surowej wydajności, jeśli oczekuje się, że nie jest to wniosek, który zajmie trochę czasu i połączy prośbę, nie rób tego async
. Asynchroniczne żądania nie szybciej, w rzeczywistości są one nieco wolniej. Z pomocą async
wnioski do DbContext mają na celu zapewnienie tego, aby twój wątek serwera www / aplikacji reagował podczas przetwarzania potencjalnie kosztownych operacji w bazie danych. Jeśli chcesz uzyskać odpowiedź jak najszybciej, użyj synchroniczny wyzwanie.
Następnie upewnij się, że wszystkie pola, w których można spędzić filtrowania, w tym przypadku Waluta indeksowana. Obecność pola z nazwą Waluty w swojej istocie w postaci ciągu znaków, a nie identyfikator waluty FK (int
) wskazanie na rekord waluty już jest dodatkowym wydatkiem na indeksowanie, ponieważ indeksy liczb całkowitych mniej/szybciej, niż indeksy wierszy.
Również nie trzeba się martwić o AsNoTracking
podczas korzystania z Count
zapytanie. AsNoTracking
stosuje się wyłącznie w przypadkach, gdy zwracasz obiekty (ToList
/ToArray
/Single
/First
itp.) , Aby uniknąć tego, aby DbContext trzymał link do zwrócony istotę. Kiedy używasz Count
/Any
lub projekcja, aby powrócić właściwości encji za pomocą Select
obiekt zwrócony do śledzenia, nie ma.
Należy także pamiętać opóźnienie w sieci między miejscem, w którym wykonywany jest kod twojej aplikacji, a serwerem bazy danych. To jedna i ta sama maszyna lub w grze jest połączenie sieciowe? Jak to się ma podczas wykonywania kwerendy SSMS? Za pomocą programu profiler można zobaczyć, że SQL EF faktycznie wysyła do bazy danych. Wszystko z perspektywy czasu-to koszty: wysyłanie zapytania do bazy danych, Zwrot otrzymanych danych przekaże, analiza tej odpowiedzi. (W przypadku, gdy wracasz do rzeczywistości, wydechu, wypełniasz, сверяете z istniejącymi łączami itp... W przypadku obliczeń itp. weryfikacja istniejących linków)
Wreszcie, aby zapewnić maksymalną wydajność, upewnij się, że czas życia swoich DbContexts zmniejszona. Jeśli DbContext pozostaje otwarta i do niego wykonywał kilka zapytań śledzenia (wybór encji bez AsNoTracking
te śledzone linki na obiekty gromadzą się i mogą negatywnie wpływać na wydajność przyszłych żądań, nawet jeśli używasz AsNoTracking
w miarę jak EF sprawdzić, czy śledzisz linki na obiekty, które mogą być stosowane/związane z nowymi żądaniami. Wiele razy widziałem, jak twórcy sugerują, że DbContexts "drogi", więc wolą tworzyć ich jak najmniej, aby uniknąć tych kosztów, tylko po to, aby z czasem zrobić operacji droższe.
Biorąc pod uwagę wszystko to, EF nigdy nie będzie tak szybkie, jak bez leczenia SQL. To ORM, przeznaczony dla zapewnienia wygody .Aplikacje sieciowe, kiedy przychodzi do pracy z danymi. To wygoda w pracy z klasami jednostek, zamiast za każdym razem czyścić i pisać swój własny suchy SQL, wiąże się z określonymi kosztami.