La fragmentación en los índices es una de las causas más comunes del mal rendimiento en las instancias SQL Server. Cuando los índices se fragmentan, el tiempo de respuesta de las consultas aumenta y el rendimiento general del servidor puede verse significativamente afectado. En este post os daré un script que os permitirá detectar los indices más fragmentados de vuestra instancia SQL Server.
¿Por qué es importante comprobar la fragmentación de los índices?
La fragmentación se produce cuando las páginas de datos de un índice no están almacenadas una detrás de la otra en el disco. Esto puede ocurrir debido a la inserción, actualización o eliminación de datos. Una alta fragmentación puede llevar a un aumento en los tiempos de lectura y escritura, afectando negativamente el rendimiento de las consultas y operaciones de la base de datos.
Es crucial comprobar la fragmentación regularmente para mantener un rendimiento óptimo. Con el script que te proporcionaré en este artículo, podrás verificar fácilmente la fragmentación de tus índices y tomar las medidas necesarias para reorganizarlos o reconstruirlos, aunque esto es mejor hacerlo con jobs de mantenimiento cómo los de Ola Hallengren.
Script para comprobar la fragmentación de los índices en SQL Server
Ejecutando el siguiente script obtendreis los indices que tiene una fragmentación igual o mayor al 5% y que tengan un númer de páginas mayor a 100. Esto es el mínimo que yo considero relevante para que la fragmentación pueda afectar realmente a la instancia.
USE Device GO PRINT 'This table displays all indexes that currently have fragmentation of 5% or above, and also have a page count of 100 or above, on the ' + DB_NAME() + ' database.'; SELECT OBJECT_NAME(IDX.OBJECT_ID) AS Table_Name, IDX.name AS Index_Name, IDXPS.index_type_desc AS Index_Type, IDXPS.avg_fragmentation_in_percent Fragmentation_Percentage, IDXPS.page_count FROM sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, NULL) IDXPS INNER JOIN sys.indexes IDX ON IDX.object_id = IDXPS.object_id AND IDX.index_id = IDXPS.index_id WHERE IDXPS.avg_fragmentation_in_percent >= 5 AND IDXPS.page_count >= 100 AND IDXPS.index_type_desc <> 'HEAP' ORDER BY Table_Name; GO PRINT CHAR(13);
El resultado de este script se ve tal que así:

Cómo reorganizar y reconstruir índices en SQL Server
Cómo ya dije anteriormente, hacer esta tarea de forma manual no es lo recomendable e incluso os insto a que no lo hagais. Es mucho más fácil hacerlo de forma automática usando los jobs de mantenimiento, pero en caso de que necesiteis hacerlo a mano, aquí teneis los códigos necesarios.
Reorganización de Índices
Reorganizar un índice implica ordenar las páginas de índice para que estén en un orden lógico continuo, sin requerir un bloqueo exclusivo. Puedes usar el siguiente comando para reorganizar un índice:
ALTER INDEX [IndexName] ON [TableName] REORGANIZE;
Reconstrucción de Índices
Reconstruir un índice es una operación más intensiva que crea una nueva copia del índice, eliminando completamente la fragmentación. Utiliza el siguiente comando para reconstruir un índice:
ALTER INDEX [IndexName] ON [TableName] REBUILD;
Mejores prácticas para mantener índices saludables
- Revisar la fragmentación regularmente: Programa tareas automáticas para verificar la fragmentación de índices.
- Mantén estadísticas actualizadas: Asegúrate de que las estadísticas de tus índices estén siempre actualizadas para un rendimiento óptimo.
- Analiza patrones de uso: Observa cómo se utilizan las tablas y los índices para ajustar las estrategias de mantenimiento.
¿Todavía tienes dudas?
Si este post no ha solucionado tu problema o todavía tienes dudas sobre este o cualquier otro asunto relacionado con SQL Server, puedes enviarme un mensaje o solicitar una consultoría gratuita haciendo clic aquí.