Masalahnya adalah rencana kueri yang basi atau salah untuk kueri saya.
Saya memecahkan masalah untuk menghapus rencana kueri yang ada untuk kueri ini.
Terima kasih kepada Vladimir Baranov karena telah mengarahkan saya ke sommarskog.se/query-plan-mysteries.html. Terima kasih juga kepada tschmit007 dan annemartijn.
Saya harus mengidentifikasi rencana kueri untuk kueri saya di database menggunakan kueri berikut:
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%'
Ini adalah versi kueri yang sedikit dimodifikasi dari makalah sommarskog. Perhatikan bahwa Anda harus meletakkan kode Anda sendiri di pernyataan serupa untuk menemukan kueri Anda. Kueri ini merespons dengan daftar atribut dan pegangan paket untuk setiap paket kueri untuk kueri saya.
Saya mencoba mencari tahu paket mana yang berasal dari SSMS dan mana dari EF, jadi saya menghapus semuanya, menggunakan sintaks berikut:
dbcc freeproccache([your plan handle here])
Paket baru yang dibuat untuk kueri EF saya berfungsi dengan baik. Rupanya, rencana EF tidak mempertimbangkan bahwa saya telah memperbarui statistik di database baru-baru ini. Sayangnya, saya tidak tahu bagaimana melakukan sp_recompile untuk kueri EF.