sql >> Base de Datos >  >> RDS >> Sqlserver

Problemas de rendimiento intermitente de la función de SQL Server

El comportamiento que está describiendo a menudo se debe a un plan de consulta almacenado en caché incorrectamente y/o estadísticas desactualizadas.

Comúnmente ocurre cuando tiene una gran cantidad de parámetros en una cláusula WHERE, especialmente una larga lista de los que tienen la forma:

(@parameter1 is NULL OR TableColumn1 = @parameter1)

Digamos que el plan de consulta en caché caduca y se llama al proceso con un conjunto de parámetros no representativo. Luego, el plan se almacena en caché para este perfil de datos. PERO, si el proceso es más común con un conjunto de parámetros muy diferente, es posible que el plan no sea apropiado. Esto a menudo se conoce como "olfateo de parámetros".

Hay formas de mitigar y eliminar este problema, pero pueden implicar compensaciones y depender de su versión de SQL Server. Mire OPTIMIZE FOR y OPTIMIZE FOR UNKNOWN . SI (y es un gran si) el proceso se llama con poca frecuencia pero debe ejecutarse lo más rápido posible, puede marcarlo como OPTION(RECOMPILE) , para forzar una recompilación cada vez que se llama, PERO no hagas esto para procesos llamados con frecuencia O sin investigación.

[NOTA:tenga en cuenta qué Paquete de servicios y actualización acumulativa (CU) su cuadro de SQL Server 2008 tiene, ya que la lógica de recompilación y rastreo de parámetros funciona de manera diferente en algunas versiones]

Ejecute esta consulta (de Glenn Berry) para determinar el estado de las estadísticas:

-- When were Statistics last updated on all indexes?
SELECT o.name, i.name AS [Index Name],  
      STATS_DATE(i.[object_id], i.index_id) AS [Statistics Date], 
      s.auto_created, s.no_recompute, s.user_created, st.row_count
FROM sys.objects AS o WITH (NOLOCK)
INNER JOIN sys.indexes AS i WITH (NOLOCK)
ON o.[object_id] = i.[object_id]
INNER JOIN sys.stats AS s WITH (NOLOCK)
ON i.[object_id] = s.[object_id] 
AND i.index_id = s.stats_id
INNER JOIN sys.dm_db_partition_stats AS st WITH (NOLOCK)
ON o.[object_id] = st.[object_id]
AND i.[index_id] = st.[index_id]
WHERE o.[type] = 'U'
ORDER BY STATS_DATE(i.[object_id], i.index_id) ASC OPTION (RECOMPILE);