Problemem był nieaktualny lub niepoprawny plan zapytania dla mojego zapytania.
Rozwiązałem problem z usunięciem istniejących planów zapytań dla tego zapytania.
Dziękuję Vladimirowi Baranovowi za skierowanie mnie na sommarskog.se/query-plan-mysteries.html. Dziękuję również tschmit007 i annemartijn.
Musiałem zidentyfikować plany zapytań dla mojego zapytania w bazie danych za pomocą następującego zapytania:
SELECT qs.plan_handle, a.attrlist, est.dbid, text
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) est
CROSS APPLY (SELECT epa.attribute + '=' + convert(nvarchar(127), epa.value) + ' '
FROM sys.dm_exec_plan_attributes(qs.plan_handle) epa
WHERE epa.is_cache_key = 1
ORDER BY epa.attribute
FOR XML PATH('')) AS a(attrlist)
WHERE est.text LIKE '%standardHourRate%' and est.text like '%q__7%'and est.text like '%Unit Overhead%'
AND est.text NOT LIKE '%sys.dm_exec_plan_attributes%'
Jest to nieco zmodyfikowana wersja zapytania z artykułu sommarskog. Zauważ, że musisz umieścić swój własny kod w podobnych instrukcjach, aby znaleźć swoje zapytanie. To zapytanie odpowiada listą atrybutów i uchwytem planu dla każdego planu zapytania dla mojego zapytania.
Próbowałem dowiedzieć się, który plan pochodzi z SSMS, a który z EF, więc usunąłem je wszystkie, używając następującej składni:
dbcc freeproccache([your plan handle here])
Nowy plan stworzony dla mojego zapytania EF działał idealnie. Najwyraźniej plan EF nie uwzględniał tego, że ostatnio aktualizowałem statystyki bazy danych. Niestety nie wiem, jak wykonać sp_recompile dla zapytania EF.