Я хочу выяснить, что является причиной высокой компиляции SQL (не повторной компиляции), которую я вижу в счетчиках монитора производительности.
Вот мое мнение: если я вижу много компиляций SQl, то это означает, что запросы в нашей системе не кэшируются по следующим причинам:
- Многие специальные запросы
Выполнение запросов, которые SQl не кеширует, например:
ОБНОВЛЕНИЕ table1 SET col1 = 'Строка длиннее 8000 символов .....' WHERE key_column = некоторый int
Планы истекают и удаляются из кэша, потому что: в кеше недостаточно места или планы не используются достаточно долго.
Единственное, что подходит для захвата вставок в кеш в профилировщике, - это хранимые процедуры-> SP: CacheInserts, но он смотрит только после кеша хранимых процедур.
Поэтому я попробовал следующее, чтобы получить adhoc запросы:
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 ;
Я думал, что запросы, которые вызывали компиляцию, должны быть с objtype = Adhoc, но это также может относиться к повторной компиляции. Теперь мне нужно запустить профилировщик, перехватить запросы, вызывающие перекомпиляцию, а затем исключить его из приведенного выше списка.
Я иду в правильном направлении?
Есть ли один запрос, который я могу использовать для выполнения только SQL-компиляций без особой работы?
Ресурсы, которые помогли мне в достижении вышеупомянутых знаний:
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
Любая помощь очень ценится.