En SQL Server, las estadísticas son uno de los principales elementos que usa el optimizador de consultas para tomar decisiones sobre que índices usar y como armar los planes de ejecución. Por esto es importante saber cuáles son las mejores prácticas que como administradores o desarrolladores deberíamos seguir. Tambien puedes leer sobre ¿Qué son las estadísticas en SQL Server y para qué sirven?.
A continuación, mis recomendaciones, pero en el contexto del marco de referencia Cynefin:
- Las mejores prácticas: definidas para dominios simples (sistema estable con causa-efecto conocidas);
- Las buenas practicas: definidas para ambientes complicados (sistemas donde la causa-efecto requieren análisis y con varias alternativas).
Para administradores de base de datos:
Mejores Prácticas de Estadísticas de Base de Datos para DBAs:
Estas recomendaciones son generales y debería tomarse en cuenta en todos los escenarios, excepto en casos extraordinarios y donde este demostrado que la práctica general no es adecuada.
- Mantenga el comportamiento predeterminado de AUTO_CREATE_STATISTICS en la base de datos (ON).
- Mantenga el comportamiento predeterminado de AUTO_UPDATE_STATISTICS en la base de datos (ON).
- Cuando está optimizando una consulta, considere hacer UPDATE STATISTICS para asegurarse que el plan corresponde a la situación actual de los datos.
- Actualice estadísticas DESPUES de la reconstrucción de índices (INDEX REBUILD), si usa sp_updatestats (recomendado). Si usa UPDATE STATISTICS, entonces actualice las estadisticas ANTES de la reconstrucción de índices.
- Actualice las estadísticas, pero no demasiado frecuentemente. Si la Base de Datos es pequeña o mediana, o incluso si es una base de datos grande pero que no es 24×7, la actualización semanal o quincenal suele ser suficiente.
- No use el Upddate Statistics Task de los planes de mantenimiento, use mejor el método sp_updatestats en una tarea de SQL.
Buenas Prácticas de Estadísticas de Base de Datos para DBAs:
Estas recomendaciones son para ambientes que tienen bases de datos con gran volumen, gran volatilidad o alguna condición particular. Estos escenarios requieren más esfuerzo de administración en mi opinión suelen ser necesarias excepto en casos especiales:
- Si va a hacer optimización de consultas y por razones de seguridad o por el volumen de los datos, no es deseable dar copia de los datos a los desarrolladores: considere usar DBCC CLONEDABASE combinado con BACKUP/RESTORE de la Base de datos clonada para suministrar información de estadísticas actualizada a los desarrolladores.
- En bases de datos transaccionales (no en Data Warehouse) considere usar la opción de configuración: AUTO_UPDATE_STATISTICS_ASYNC en la base de datos para mantener un desempeño más estable de las consultas.
- En bases de datos tipo Bodegas de datos (Data Warehouse) o en Datamarts que tienen cargas masivas periódicas, considere ejecutar sp_updatestats cuando termina la ejecución de las cargas, para que las estadísticas estén actualizadas al momento que se hacen consultas y garantizar mejor desempeño en las consultas.
- En bases de datos grandes con actividad 24×7, considere tener un plan de mantenimiento (un job de SQL Server) que actualice parcialmente algunas tablas durante horas de menor actividad.
- En tablas de gran volumen de filas y con consultas con predicados con alta correlación entre columnas, las estadísticas sobre múltiples columnas pueden ayudar a mejorar los planes de ejecución. Esta opción requiere experticia para que sea efectiva, y suele combinarse con la recomendación siguiente.
- Si tiene grandes variaciones en la distribución de las columnas, y alta correlación entre columnas utilice estadísticas filtradas.
- Considere borrar estadísticas innecesarias, pero no suele ser un factor muy importante. NO borre de forma automática las estadísticas autogeneradas.
Para desarrolladores:
Mejores Prácticas de Estadísticas de Base de Datos para DBAs:
- Mantenga el comportamiento predeterminado del AUTO CREATE STATISTICS (ON).
- Mantenga el comportamiento predeterminado del AUTO UPDATE STATISTICS (ON).
- Cuando está optimizando una consulta considere hacer UPDATE STATISTICS para asegurarse que el plan corresponde a la situación actual de los datos.
- No utilice variables tablas, si va a hacer JOINS con ellas.
- Si usa tablas temporales, escriba código que las llena al principio del procedimiento almacenado o del lote de comandos. Si debe llenarlas en diferentes lugares considere actualizar las estadísticas antes de iniciar consultas sobre ellas.
En posteos futuros planeo expandir el tópico de estadísticas de SQL Server y entrar en detalle en explicaciones de porque considero que estas son mejores/buenas prácticas. Si quieres aprender como leer estadísticas puedes ver Como leer estadísticas en SQL Server
Crees que hay alguna mejor práctica que deberia agregar a la lista? Crees que hay alguna de las sugerencias que NO es apropiada o que deberia especificar?
Deja una respuesta