Je veux savoir ce qui cause les hautes compilations SQL (pas les recompilations) que je vois dans les compteurs de moniteur de performances.
Voici mon point de vue: si je vois beaucoup de compilations SQl, cela signifie que les requêtes sur notre système ne sont pas mises en cache pour les raisons suivantes:
- De nombreuses requêtes ad hoc
Exécution de requêtes que SQl ne met pas en cache, par exemple:
UPDATE table1 SET col1 = 'Chaîne de plus de 8000 caractères .....' OERE key_column = certains int
Les plans expirent et sont supprimés du cache car: Le cache manque d'espace ou les plans ne sont pas utilisés assez longtemps.
La seule chose qui se rapproche de la capture d'insertions de cache dans le profileur est les procédures stockées-> SP: CacheInserts, mais il ne s'occupe que du cache des procédures stockées.
J'ai donc essayé ce qui suit pour obtenir des requêtes ad hoc:
SELECT [cp].[refcounts] -- when Refcounts becomes 0, plan is excluded from cache.
, [cp].[usecounts]
, [cp].[objtype]
, st.[dbid]
, st.[objectid]
, st.[text]
, [qp].[query_plan]
FROM sys.dm_exec_cached_plans cp
CROSS APPLY sys.dm_exec_sql_text ( cp.plan_handle ) st
CROSS APPLY sys.dm_exec_query_plan ( cp.plan_handle ) qp ;
Je pensais que les requêtes à l'origine des compilations devraient être celles avec objtype = Adhoc mais cela pourrait également concerner les recompilations. Maintenant, je dois exécuter le profileur, capturer les requêtes provoquant des recompilations, puis l'exclure de la liste ci-dessus.
Suis-je dans la bonne direction?
Existe-t-il une seule requête que je peux utiliser pour réaliser uniquement des compilations SQL sans trop de travail?
Ressources qui m'ont aidé à acquérir les connaissances ci-dessus:
http://social.msdn.microsoft.com/Forums/en/sqldatabaseengine/thread/954b4fba-3774-42e3-86e7-e5172abe0c83
http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=143946
http: //technet.microsoft.com/en-nz/library/cc966425(en-us).aspx
http://www.sqlservercentral.com/Forums/Topic914951-360-1.aspx
Toute aide est vraiment appréciée.