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.
la source
Avez-vous de nombreux travaux SQL Server exécutés fréquemment sur cette zone? Notez qu'en 2005, les requêtes de travail d'agent ne sont PAS mises en cache et peuvent également provoquer les compilations de saturation et sql du cache.
Regardez le nombre de plans avec un faible nombre de réutilisation. Ce sont vos coupables.
Quelques notes connexes sur la mise en cache du plan ci-dessous.
http://www.sqlskills.com/BLOGS/KIMBERLY/post/Plan-cache-adhoc-workloads-and-clearing-the-single-use-plan-cache-bloat.aspx
http://www.sqlskills.com/BLOGS/KIMBERLY/post/Clearing-the-cache-are-there-other-options.aspx
la source
Cet effet est connu sous le nom de «pollution du plan de requête», où de nombreuses requêtes SQL similaires génèrent des plans d'exécution distincts mais équivalents.
Les requêtes ad hoc entraînent des frais généraux par analyse individuelle, mais généralement pas la pollution du plan de requête, car leurs plans ne sont pas stockés. Ceci est différent pour les requêtes avec un seul paramètre (sous MS SQL Server), celles-ci seront traitées comme une requête paramétrée.
Il existe des cas typiques de pollution du plan de requête:
la source