SSMS
 sql >> Datenbank >  >> Database Tools >> SSMS

SQL-Abfrage mit Entity Framework wird langsamer ausgeführt, verwendet einen fehlerhaften Abfrageplan

Das Problem war ein veralteter oder falscher Abfrageplan für meine Abfrage.

Ich habe das Problem zum Löschen der vorhandenen Abfragepläne für diese Abfrage gelöst.

Danke an Vladimir Baranov für den Verweis auf sommarskog.se/query-plan-mysteries.html. Danke auch an tschmit007 und annemartijn.

Ich musste die Abfragepläne für meine Abfrage in der Datenbank mithilfe der folgenden Abfrage identifizieren:

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%'

Dies ist eine leicht modifizierte Version der Abfrage aus Sommarskogs Artikel. Beachten Sie, dass Sie Ihren eigenen Code in die Like-Anweisungen einfügen müssen, um Ihre Abfrage zu finden. Diese Abfrage antwortet mit der Attributliste und dem Planhandle für jeden Abfrageplan für meine Abfrage.

Ich habe versucht herauszufinden, welcher Plan von SSMS und welcher von EF stammt, also habe ich alle mit der folgenden Syntax gelöscht:

dbcc freeproccache([your plan handle here])

Der neue Plan, der für meine EF-Abfrage erstellt wurde, funktionierte perfekt. Anscheinend hat der EF-Plan nicht berücksichtigt, dass ich kürzlich Statistiken in der Datenbank aktualisiert hatte. Leider weiß ich nicht, wie man ein sp_recompile für eine EF-Abfrage durchführt.