En febrero escribí una publicación de blog sobre la corrección automática de planes en SQL Server, y en esta publicación quiero hablar sobre la administración automática de índices, el segundo componente de la función de ajuste automático. La administración automática de índices solo está disponible en Azure SQL Database y actualmente no está en la hoja de ruta para estar disponible en la próxima versión de SQL Server local. Esta opción está habilitada independientemente de la Corrección Automática del Plan y, como su nombre lo indica, administrará los índices en su base de datos. Específicamente, puede crear índices que faltan y puede eliminar índices que no se usan y aquellos que están duplicados. Echemos un vistazo a cómo ocurre esto.
Bajo las sábanas
La gestión automática de índices se basa en datos para tomar su decisión. Para la creación de índices potenciales, utiliza información del DMV de índices faltantes y la rastrea a lo largo del tiempo y combina esos datos con un modelo interno para determinar el beneficio del índice. También utiliza el Almacén de consultas para determinar si el índice brinda beneficios, por lo que debe habilitarse para la base de datos, al igual que con la Corrección automática del plan. Con respecto a la eliminación de índices, se utilizan los datos del DMV de uso de índices (sys.dm_db_index_usage_stats), así como los metadatos del índice (p. ej., número de columnas, tipos de datos de columna).
Habilitación de la gestión automática de índices
Como se mencionó, Query Store debe estar habilitado para la base de datos. Esto se puede hacer en SSMS, con T-SQL y con REST API para Azure SQL Database. Tenga en cuenta que Query Store está habilitado de forma predeterminada para las bases de datos en Azure, y lo ha estado desde el cuarto trimestre de 2016.
USE [master]; GO ALTER DATABASE [WideWorldImporters] SET QUERY_STORE = ON; GO ALTER DATABASE [WideWorldImporters] SET QUERY_STORE (OPERATION_MODE = READ_WRITE); GO
Una vez que Query Store está habilitado, puede usar Azure Portal, T-SQL o EST API para habilitar la administración automática de índices en Azure SQL Database (C# y PowerShell están en proceso).
ALTER DATABASE [WWI_PS] SET AUTOMATIC_TUNING (CREATE_INDEX = ON, DROP_INDEX = ON); GO
La administración automática de índices se habilitará de forma predeterminada para las nuevas bases de datos en Azure (https://azure.microsoft.com/en-us/blog/automatic-tuning-will-be-a-new-default/) en un futuro próximo. A partir de enero de 2018, Microsoft comenzó la implementación para habilitar el ajuste automático para las bases de datos de Azure SQL que aún no lo tenían habilitado, con notificaciones enviadas a los administradores para que la opción se pueda deshabilitar si lo desea. Este proceso lleva varios meses, así que si aún no has recibido una notificación, ¡no entres en pánico!
Cómo funciona
Para la creación de índices, actualmente existe una ventana móvil de siete (7) días* a lo largo de los cuales se rastrean los datos y, como mínimo, el modelo necesita nueve (9) horas* de datos para recomendar un índice, junto con con 12 horas* de datos en Query Store que se usarán como referencia. Si se determina que un índice proporcionará un beneficio significativo, SQL Server creará el índice.
*Estos valores pueden cambiar en el futuro, a medida que se desarrolle el modelo.
Nota:en la actualidad, el modelo fusiona recomendaciones. Es decir, si se recomiendan varios índices para una tabla, pero se puede crear un índice para cubrir todas las opciones, puede crear ese índice actualmente. Sin embargo, el modelo actualmente no es lo suficientemente inteligente como para fusionar un índice recomendado con uno que ya existe.
Una vez que se crea un índice, SQL Server verifica que proporciona beneficios mediante Query Store (por lo tanto, debe estar habilitado para la base de datos). Supervisa el rendimiento de cualquier consulta que use el nuevo índice y compara la CPU de la consulta antes de agregar el índice y cuando se usa el índice. Si hay una regresión en el rendimiento de las consultas como resultado del índice, revertirá (eliminará) el índice. SQL Server supervisa el rendimiento de las consultas durante un máximo de tres (3) días, o hasta que se haya analizado el 100 % de la carga de trabajo relevante. Después de ese período de tiempo, si el índice no muestra signos de regresión, no volverá a revisar el rendimiento.
Comprenda que si la administración automática de índices crea un índice, y luego, dos meses después, su carga de trabajo cambia y se beneficiaría de ese mismo índice creado automáticamente anteriormente pero con una columna adicional, entonces SQL Server, en la actualidad, creará un nuevo índice. Actualmente no existe una lógica para modificar un índice existente creado automáticamente, pero esa funcionalidad está en la hoja de ruta de la función.
Con respecto a la eliminación de índices, si un índice no tiene búsquedas ni exploraciones durante 90 días, pero tiene un costo de mantenimiento (lo que significa que hay inserciones, actualizaciones o eliminaciones), se eliminará. Los índices duplicados también se eliminarán, suponiendo que sean un duplicado exacto (y el esquema se usa para determinar si los índices son exactamente iguales). Si hay índices duplicados en términos de columnas clave y columnas incluidas (si corresponde), pero uno o más de ellos tiene un filtro, entonces no son realmente duplicados y no se descartará ningún índice.
Como referencia, hay dos veces más recomendaciones DROP INDEX en Azure SQL Database que recomendaciones CREATE INDEX.
Cuando habilita la opción DROP INDEX, SQL Server eliminará los índices creados por el usuario. Cuando habilita la opción CREAR ÍNDICE, SQL Server tiene la capacidad de crear índices automáticamente y también puede descartar esos índices (pero no eliminará los índices creados por el usuario). Por último, los índices se crean y eliminan durante las horas de menor carga de trabajo, según lo determine la DTU. Si la carga de trabajo supera el 80 % de DTU, SQL Server esperará para crear o eliminar el índice hasta que la carga del sistema disminuya.
¿Realmente voy a dejar que SQL Server tenga el control?
Tal vez. Mi recomendación sobre esta función, inicialmente, requiere un enfoque de "confiar pero verificar".
Al igual que con la corrección automática de planes, la gestión automática de índices se ha desarrollado con una cantidad sustancial de datos capturados de casi dos millones de bases de datos Azure SQL. La función Administración automática de índices está disponible en Azure SQL Database desde el primer trimestre de 2016, como parte de Index Advisor.
Los algoritmos utilizados por la función han evolucionado y continúan evolucionando con el tiempo, a medida que más bases de datos lo utilizan y se capturan y analizan más datos. Sin embargo, existen algunas limitaciones actualmente.
- Las recomendaciones de índices no se evalúan con los índices existentes, por lo que la consolidación de índices entre índices nuevos y existentes no está disponible actualmente.
- Si un índice proporcionara beneficios para una SELECCIÓN, la sobrecarga de modificaciones debido a INSERCIONES, ACTUALIZACIONES y ELIMINACIONES no se conoce antes de la creación. SQL Server supervisa esta sobrecarga durante el proceso de verificación, después de implementar el índice.
Hay beneficios de la gestión automática de índices que vale la pena mencionar:
- Para cualquiera que tenga que administrar una base de datos de SQL Server, pero no sea un DBA, las recomendaciones de índices pueden ser extremadamente útiles.
- Las recomendaciones de índice se capturan en sys.dm_db_tuning_recommendations DMV incluso si las opciones de índice CREATE y DROP no están habilitadas. Por lo tanto, si no está seguro de los cambios que podría realizar SQL Server, puede revisar lo que se captura en el DMV y luego tomar la decisión de implementar manualmente la recomendación.
Nota:Si implementa manualmente la recomendación, SQL Server no realiza ninguna validación. Si implementa la recomendación a través del Portal (usando el botón Aplicar) o la API REST, entonces se ejecutará como si fuera una acción automática y se realizará la validación (y el índice podría revertirse automáticamente si hay una regresión).
- La característica sigue mejorando. Como dije antes, Microsoft no está tratando de dejar sin trabajo a los administradores de bases de datos (DBA) o a los desarrolladores, sino que está tratando de abordar la fruta madura para que tenga más tiempo para las tareas y proyectos que no se pueden automatizar de manera inteligente.
Resumen
Si no está listo para entregar las riendas de la gestión de índices, lo entiendo. Pero si tiene una base de datos Azure SQL como mínimo, debe consultar el DMV sys.dm_db_tuning_recommendations con regularidad para ver qué recomienda SQL Server y compararlo con los datos que usted o su herramienta de monitoreo de terceros podrían estar capturando sobre el uso del índice. Después de todo, ¿cuándo fue la última vez que realizó una revisión completa y minuciosa de sus índices para comprender lo que falta, lo que realmente se usa y lo que simplemente genera una sobrecarga en la base de datos?