SSMS
 sql >> Base de données >  >> Database Tools >> SSMS

La requête SQL utilisant Entity Framework s'exécute plus lentement, utilise un mauvais plan de requête

Le problème était un plan de requête obsolète ou incorrect pour ma requête.

J'ai résolu le problème de suppression des plans de requête existants pour cette requête.

Merci à Vladimir Baranov de m'avoir indiqué sommarskog.se/query-plan-mysteries.html. Merci également à tschmit007 et annemartijn.

J'ai dû identifier les plans de requête pour ma requête dans la base de données à l'aide de la requête suivante :

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

Il s'agit d'une version légèrement modifiée de la requête de l'article de sommarskog. Notez que vous devez mettre votre propre code dans les déclarations similaires pour trouver votre requête. Cette requête répond avec la liste d'attributs et le descripteur de plan pour chaque plan de requête pour ma requête.

J'ai essayé de déterminer quel plan provenait de SSMS et lequel d'EF, alors je les ai tous supprimés, en utilisant la syntaxe suivante :

dbcc freeproccache([your plan handle here])

Le nouveau plan créé pour ma requête EF a parfaitement fonctionné. Apparemment, le plan EF n'a pas tenu compte du fait que j'avais récemment mis à jour les statistiques sur la base de données. Malheureusement, je ne sais pas comment faire un sp_recompile pour une requête EF.