Widzę kilka naprawdę dziwnych perf związanych z bardzo prostym zapytaniem przy użyciu Entity Framework Code-First z platformą .NET 4. Wersja LINQ2Entities wygląda następująco:Entity Framework zapytanie powolne, ale ten sam SQL w SqlQuery jest szybki
context.MyTables.Where(m => m.SomeStringProp == stringVar);
Zajmuje to 3000 milisekund do wykonania. Wygenerowany kod SQL wygląda bardzo prosto:
SELECT [Extent1].[ID], [Extent1].[SomeStringProp], [Extent1].[SomeOtherProp],
...
FROM [MyTable] as [Extent1]
WHERE [Extent1].[SomeStringProp] = '1234567890'
To zapytanie działa niemal natychmiast po uruchomieniu za pomocą Management Studio. Kiedy zmienić kod C#, aby korzystać z funkcji sqlquery, działa w 5-10 milisekund:
context.MyTables.SqlQuery("SELECT [Extent1].[ID] ... WHERE [Extent1].[SomeStringProp] = @param", stringVar);
Tak, dokładnie ten sam SQL, wynikające z istoty są śledzone zmiany w obu przypadkach, ale dziki różnica między perf dwa. Co daje?
Oczekuję, że widzisz opóźnienia inicjalizacji - prawdopodobnie zobacz kompilację. Zobacz MSDN: ["Rozważania wydajności dla Entity Framework 5"] (http://msdn.microsoft.com/en-us/data/hh949853.aspx) –
Próbowałem generowania widoków i nie wydaje mi się pomóc. Ponadto uruchomiono inne zapytanie EF przed zwolnieniem, aby wykluczyć możliwość inicjalizacji. Nowe zapytanie działało szybko, powolne nadal działało powoli, mimo że rozgrzewka kontekstu miała miejsce podczas pierwszego zapytania. –
@marc_s - Nie, SqlQuery zwróci w pełni zmaterializowaną i śledzoną instancję obiektu. Zobacz http://msdn.microsoft.com/en-us/library/system.data.entity.dbset.sqlquery(v=vs.103).aspx –