SQL Server Profiler

Pomoc w optymalizacji zapytań Entity Framework

Piotr Wandycz
Narzędzia

Entity Framework w dużej aplikacji potrafi czasami napsuć trochę krwi. Warto więc wiedzieć, że istnieje możliwość podejrzenia generowanych przez niego zapytań. Jeśli masz zainstalowany SSMS (SQL Server Management Studio) – to dostajesz opcję skorzystania z profilera. Uruchomić go można na dwa sposoby: albo wpisując “SQL Server Profiler” (+ rok) bezpośrednio w Windowsie, albo przez zakładkę narzędzi w SSMS.

Po uruchomieniu musimy zalogować się do naszego serwera bazy danych, a po tym zobaczymy takie okienko:

I teraz są dwie opcje: można wejść w Event Selection i powybierać ustawienia z setki, albo iść prostą ścieżką i zatrzymywać przechwytywanie zdarzeń do momentu kiedy potrzebujemy coś sprawdzić. Ja używam profilera raz na ruski rok, więc opanowałem te trzy guziki i póki co mi to wystarcza.

Profiler może być świetnym narzędziem do nauki Entity Frameworka. Popatrzmy na przykładowe zapytanie:

db.Products.Where(x => x.MakeFlag == true).ToList();

Bardzo mało kodu, z bardzo dużym narzutem na bazę. W wygenerowanym SQLu widzimy, że zostały pobrane wszystkie kolumny, nastąpiło 860 logicznych odczytów, w czasie 133 ms.

A gdyby tak ograniczyć kolumny tylko do tych, których rzeczywiście potrzebowaliśmy?

db.Products.Where(x => x.MakeFlag == true).Select(x => x.Name).ToList();

Nagle uzyskujemy wynik rzędu kilku milisekund.

W drugim przykładzie wybieramy trzy kolumny, ale odwołujemy się do innej tabeli.

db.PurchaseOrderDetails.Select(x => new { x.OrderQty, x.UnitPrice, x.Product.Name }).ToList();

Możemy tu zobaczyć, że pod spodem został zrobiony INNER JOIN. Nastąpiły 72 odczyty logiczne, w czasie 34 ms.

A co jeśli nie znasz różnicy między IEnumerable i IQueryable i wykonasz ToList najpierw?

db.PurchaseOrderDetails.ToList().Select(x => new { x.OrderQty, x.UnitPrice, x.Product.Name });

Jedna mała zmiana i czterokrotny wzrost odczytów logicznych oraz pięciokrotny czasu.

Jeśli używasz w projekcie EF do odpytywania bazy, to warto czasem podejrzeć jaki kod SQL generuje się pod maską – zwłaszcza że najprawdopodobniej posiadasz już zainstalowany profiler na swoim komputerze.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *