En el mundo de SQL Server, las estadísticas desempeñan un papel crucial en la optimización del rendimiento de las consultas. En este artículo, exploraremos el concepto de las estadísticas, cómo se crean y por qué son importantes en la optimización del rendimiento.
Tipos de estadísticas
Existen dos tipos de estadísticas en SQL Server: estadísticas de índice y estadísticas de columna. Las estadísticas de índice se crean como parte de la creación de índices, mientras que las estadísticas de columna se crean automáticamente por SQL Server cuando una columna se referencia en la cláusula WHERE o GROUP BY de una consulta.
Auto Crear y Auto Actualizar Estadísticas
SQL Server proporciona configuraciones a nivel de base de datos para controlar el comportamiento de auto creación y auto actualización de estadísticas. De forma predeterminada, la auto creación de estadísticas está habilitada, lo que permite al optimizador de consultas crear estadísticas de columna cuando sea necesario para una mejor estimación de la consulta. Se recomienda mantener esta configuración habilitada para un rendimiento óptimo.
La auto actualización de estadísticas también está habilitada de forma predeterminada y ayuda al optimizador de consultas a actualizar las estadísticas cuando se vuelven obsoletas. Las estadísticas se vuelven obsoletas cuando hay un cambio significativo en los datos. SQL Server utiliza un límite de umbral para determinar cuándo las estadísticas están obsoletas. De forma predeterminada, la auto actualización de estadísticas ocurre de forma sincrónica, lo que significa que el optimizador de consultas espera a que se complete el proceso de actualización de estadísticas. Sin embargo, también se puede configurar en modo asíncrono, donde el optimizador de consultas inicia el proceso de actualización de estadísticas sin esperar a que se complete. Este modo puede beneficiar a cargas de trabajo que requieren un rendimiento constante.
Muestreo de datos para estadísticas
Cuando se crean o actualizan las estadísticas, SQL Server no realiza un escaneo completo de los datos. En su lugar, muestrea los datos para calcular las estadísticas dentro de un marco de tiempo aceptable. Esta técnica de muestreo permite una estimación eficiente de los planes de ejecución de consultas.
Impacto de las estadísticas en el rendimiento de las consultas
Veamos cómo las estadísticas afectan el rendimiento de las consultas a través de un ejemplo práctico. En este ejemplo, tenemos una tabla llamada “SalesOrderDetail” con un índice en la columna “ProductID”. Compararemos el rendimiento de dos conjuntos de consultas: uno con la auto actualización de estadísticas habilitada y otro con ella deshabilitada.
En el primer conjunto de consultas, con la auto actualización de estadísticas habilitada, actualizamos todos los registros en la tabla excepto uno para tener un valor de “ProductID” diferente. Cuando ejecutamos una consulta con una condición WHERE en “ProductID=776”, el optimizador de consultas estima 1.000348 registros y elige una operación de búsqueda de índice. Cuando ejecutamos una consulta con una condición WHERE en “ProductID=775”, el optimizador de consultas estima 121316 registros y elige una operación de escaneo de tabla en lugar de una búsqueda de índice. Esto se debe a que es más rentable escanear todas las páginas en lugar de usar una búsqueda de índice y una operación de búsqueda de marcador para recuperar todos los registros (excepto el que tiene “ProductID=776”) de la tabla.
En el segundo conjunto de consultas, con la auto actualización de estadísticas deshabilitada, el optimizador de consultas estima 228 registros para la consulta con “ProductID=776” y elige una operación de búsqueda de índice. Sin embargo, para la consulta con “ProductID=775”, el optimizador de consultas estima 234 registros y elige una búsqueda de índice no agrupado y una operación de búsqueda de marcador en lugar de un simple escaneo de tabla. Esta estimación se basa en las estadísticas creadas como parte de la creación de índices y se vuelve obsoleta después de la actualización. La declaración SELECT en este caso realiza 121690 operaciones lógicas de E/S, lo cual es significativamente mayor en comparación con las 1495 operaciones de E/S utilizadas en el plan con la auto actualización de estadísticas habilitada.
A partir de estos ejemplos, queda claro que el optimizador de consultas requiere información de estadísticas actualizadas para elegir el plan de ejecución óptimo, incluso si todos los índices necesarios están en su lugar. Por lo tanto, al solucionar problemas de rendimiento, es importante considerar las estadísticas. Una diferencia considerable entre el número estimado de registros y el número real de registros debería ser un indicador para investigar la información de las estadísticas o actualizarlas manualmente.
Controlando la auto actualización de estadísticas
La función de auto actualización de estadísticas se puede controlar en diferentes niveles:
- A nivel de base de datos, utilizando el comando “ALTER DATABASE”:
ALTER DATABASE mydb SET AUTO_UPDATE_STATISTICS OFF - A nivel de índice, utilizando la opción “STATISTICS_NORECOMPUTE” al crear o reconstruir el índice
- A nivel de estadísticas, utilizando la opción “NORECOMPUTE” al crear o actualizar las estadísticas
El procedimiento “sp_autostats” se puede utilizar para ver la configuración de auto actualización de estadísticas de cada estadística asociada con una tabla. Si la auto actualización de estadísticas está deshabilitada a nivel de base de datos, se descartarán las configuraciones a nivel de tabla. Las configuraciones de auto actualización de estadísticas a nivel de tabla se pueden cambiar utilizando el procedimiento “sp_autostats”.
Comprender y gestionar las estadísticas es crucial para optimizar el rendimiento de las consultas en SQL Server. Al asegurarse de que las estadísticas estén actualizadas, puede ayudar al optimizador de consultas a tomar decisiones informadas y elegir los planes de ejecución más eficientes.
Si encontraste útil este artículo, por favor dale me gusta a mi página en Facebook: www.PracticalSqlDba.com