Quiero averiguar qué está causando las altas compilaciones SQL (no las recompilaciones) que estoy viendo en los contadores del monitor de rendimiento.
Aquí está mi opinión: si estoy viendo muchas compilaciones SQl, significa que las consultas en nuestro sistema no se almacenan en caché por los siguientes motivos:
- Muchas consultas ad hoc
Ejecutando consultas que SQl no almacena en caché, por ejemplo:
ACTUALIZAR table1 SET col1 = 'Cadena de más de 8000 caracteres .....' WHERE key_column = some int
Los planes se están agotando y se están eliminando de la memoria caché porque: la memoria caché se está quedando sin espacio o los planes no se están utilizando el tiempo suficiente.
Lo único que se acerca a la captura de inserciones de caché en el generador de perfiles es Procedimientos almacenados-> SP: CacheInserts, pero solo se ocupa de la caché de procedimientos almacenados.
Así que intenté lo siguiente para obtener consultas 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 ;
Pensé que las consultas que causaron las compilaciones deberían ser las que tienen objtype = Adhoc, pero esto también podría relacionarse con las recompilaciones. Ahora tengo que ejecutar el generador de perfiles, capturar consultas que causan recompilaciones y luego eliminarlas de la lista anterior.
¿Voy en la dirección correcta?
¿Hay una sola consulta que pueda usar para lograr compilaciones SQL sin demasiado trabajo?
Recursos que me ayudaron a lograr el conocimiento anterior:
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
Cualquier ayuda es muy apreciada.
fuente
¿Tiene muchos trabajos frecuentes de SQL Server en este cuadro? Tenga en cuenta que en 2005 las consultas de trabajo del agente NO se almacenan en caché y también pueden provocar la compilación de caché y compilaciones sql.
Mire la cantidad de planes con recuentos bajos de reutilización. Esos son tus culpables.
Algunas notas relacionadas sobre el almacenamiento en caché del plan a continuación.
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
fuente
Este efecto se conoce como "contaminación del plan de consulta", donde muchas consultas SQL similares generan planes de ejecución separados pero equivalentes.
Las consultas ad-hoc causan sobrecarga por análisis individual, pero generalmente no consultan la contaminación del plan, ya que sus planes no se almacenan. Esto es diferente para consultas con un solo parámetro (en MS SQL Server), estas serán tratadas como una consulta parametrizada.
Hay algunos casos típicos para la contaminación del plan de consulta:
fuente