Optimizar las estadísticas en SQL Server

Las estadísticas en SQL Server se utilizan para que el servidor ante una petición ejecute un plan de ejecución adecuado y optimizado al máximo para la misma. Existen varias opciones en las propiedades de la base de datos para gestionar las estadísticas, veremos cada una de ellas para garantizar la mejor configuración de la base de datos.

Para ver y editar la configuración de las estadísticas de una base de datos en SQL Server:
  1. Abrir el SQL Server Managment Studio
  2. Conectarse a la instancia donde está alojada nuestra base de datos.
  3. En el panel izquierdo clic derecho en la base de datos que queremos consultar y del menú desplegable elegir Propiedades.
  4. En la ventana de propiedades de la base de datos elegir a la izquierda la página de Opciones
  5. Aparecerán las configuraciones de las estadísticas en el apartado automático

Crear estadísticas automáticamente (Auto Create Statistics)

Se recomienda fuertemente activar Auto Create Statistics pues es una de las formas que utiliza el propio SQL Server para mejorar el rendimiento. El coste para ejecutar esta opción es mínimo en comparación con el problema de rendimiento que puede experimentar si una estadística necesaria falta y SQL Server no la puede crear. Las estadísticas son un factor muy importante en el plan de consultas eficientes que viene con SQL Server.

Actualizar estadísticas automáticamente (Auto Update Statistics)

También Microsoft recomienda fuertemente activar Auto Update Statistics porque al igual que la opción anterior el propio SQL Server la utiliza para mejorar el rendimiento. El coste para ejecutar esta opción es mínimo en comparación con el problema de rendimiento que puede experimentarse si una estadística no está actualizada y SQL Server la utiliza para compilar la consulta y crear el plan de ejecución. Esto es muy importante sobre todo para procesos que incluyen llamadas a FINDFIRST, FINDLAST, FIND('-'), FIND('+'), y FINDSET para determinada entrada porque si la estadística en el N º de entrada está desactualizada llevará a SQL Server más tiempo para encontrar el primer y último valor, bloqueando el recurso durante mucho tiempo y causando un impacto negativo en la concurrencia del sistema y, posiblemente, resultando en tiempos muertos de bloqueo (Lock Time Outs).

La tercera opción (Auto Update Statistics Asynchronously) es ejecutar esta actualización de estadísticas de manera asíncrona, existe un excelente post dónde podemos ver las diferencias entre ambas: Actualización de estadísticas síncrona vs asíncrona.

Trabajo de mantenimiento periódico para actualizar las estadísticas

Incluso con la opción de actualizar estadísticas automáticamente activada se recomienda ejecutar un trabajo de mantenimiento periódico para actualizar las mismas. Esto se debe a que la actualización automática de estadísticas sólo se activa cuando el 5% de los datos de esta estadística ha cambiado y en tablas que pueden tener entre los 10 de millones de registros un pequeño porcentaje de los datos en una estadística dada como [N º de entrada] puede cambiar con un efecto significativo sobre la distribución general de los datos de esta estadística causando planes de ejecución de consultas ineficientes mucho antes de que el umbral del 5% se alcance provocando como resultado un rendimiento degradado.

Se recomienda el uso de sp_updatestats para realizar esta tarea, ya que sólo se actualizarán las estadísticas donde los datos se han cambiado. Microsoft recomienda la creación de un trabajo de SQL que se ejecute diaria o semanalmente (dependiendo del volumen de transacciones) en las horas pico para actualizar todas las estadísticas donde los datos han cambiado.

NOTA: en la plantilla para la creación del trabajo no utilizar "FULLSCAN porque es una pérdida de tiempo pues se sobrescribirá en el momento en que la estadística se auto actualiza.

Al crear el trabajo programado en el agente de SQL Server lo único que tenemos que poner como comando T-SQL es lo siguiente:

EXEC sp_updatestats

Si lo queremos ejecutar desde la consola del SQL Server Managment Studio entonces sería:

USE database_name;
GO
EXEC sp_updatestats

Comentarios