La fragmentación del índice de SQL Server es una fuente común de degradación del rendimiento de la base de datos. La fragmentación ocurre cuando hay mucho espacio vacío en una página de datos (fragmentación interna) o cuando el orden lógico de las páginas en el índice no coincide con el orden físico de las páginas en el archivo de datos (fragmentación externa).
Los problemas de rendimiento relacionados con la fragmentación se observan con mayor frecuencia cuando se ejecutan consultas que realizan exploraciones de índice. Es posible que las consultas que realizan búsquedas de índice no se vean afectadas por una fragmentación de alto índice.
Comprender los tipos de fragmentación de índices de SQL Server
Fragmentación de índice interno
La fragmentación interna ocurre cuando las páginas de datos tienen demasiado espacio libre. Este espacio adicional se introduce a través de algunas vías diferentes:
- SQL Server almacena datos en páginas de 8 KB. Entonces, cuando inserta menos de 8 KB de datos en una tabla, se queda con un espacio en blanco en la página.
- Por el contrario, si inserta más datos de los que tiene espacio en la página, el exceso se envía a otra página. Es poco probable que los datos adicionales llenen perfectamente las páginas siguientes, por lo que, de nuevo, te quedará un espacio en blanco en una página.
- El espacio en blanco en una página de datos también ocurre cuando se eliminan datos de una tabla.
La fragmentación interna provoca principalmente problemas de rendimiento cuando SQL Server realiza un análisis de índice. El rendimiento se ralentiza cuando SQL Server tiene que escanear muchas páginas parcialmente llenas para encontrar los datos que busca.
Fragmentación de índice externo
La fragmentación externa es el resultado de que las páginas de datos estén desordenadas. Esto se debe a la inserción o actualización de datos en páginas de hojas completas. Cuando se agregan datos a una página completa, SQL Server crea una división de página para acomodar los datos adicionales y la nueva página se separa de la página original.
La fragmentación externa provoca problemas de rendimiento al aumentar la E/S aleatoria. Cuando las páginas no son secuenciales, SQL Server tiene que leer datos de varias ubicaciones, lo que lleva más tiempo que leer en orden.
Cómo evitar la fragmentación del índice de SQL Server
No es posible evitar por completo la fragmentación de índices, pero hay formas de minimizar su ocurrencia y disminuir el efecto de la fragmentación en el rendimiento de la base de datos. Aquí hay algunos pros y contras para evitar la fragmentación del índice de SQL Server:
HACER: Elija claves de clúster que sean valores cada vez mayores o valores cada vez menores. Esto reducirá las divisiones de página porque cuando inserte registros, se colocarán al principio o al final de la cadena de páginas lógicas.
NO: Insertar registros con valores clave aleatorios. Elija valores clave estáticos para que, una vez colocado un registro, nunca tenga que moverse y no se desordene.
NO: Actualice los registros para hacerlos más largos. Agregar registros a un índice durante una actualización puede requerir que SQL Server envíe algunos de los datos a una página nueva. Esto puede resultar en páginas de hojas no secuenciales y, eventualmente, problemas de rendimiento.
NO: Actualice las columnas de clave de índice. Las actualizaciones de columnas clave requieren una eliminación de fila completa seguida de una inserción de fila completa con el nuevo valor de clave. Si la nueva fila se inserta en una página sin espacio suficiente, se dividirá la página.
HACER: Tenga en cuenta las funciones que pueden causar divisiones de página. Tenga en cuenta los posibles resultados finales de modificar cualquier característica que involucre índices. Por ejemplo, la actualización de columnas de ancho variable (incluso en columnas que no son clave) en un índice agrupado puede causar divisiones de página.
HACER: Implemente factores de relleno de índice apropiados. Analice la fragmentación en la configuración del factor de llenado predeterminado y ajústela según sea necesario para minimizar la fragmentación excesiva con la carga normal.
Cómo corregir la fragmentación del índice de SQL Server
Debido a que es imposible prevenir la fragmentación el 100 por ciento del tiempo, es importante saber cómo corregir la fragmentación del índice de SQL Server si el rendimiento se ve afectado.
Antes de que pueda decidir cómo abordar su problema de fragmentación de índices de SQL Server, primero debe determinar qué tan extenso es el problema con el que está lidiando.
El mejor lugar para comenzar es usar el DMF sys.dm_db_index_physical_stats para analizar el nivel de fragmentación de sus índices. Una vez que sepa cuán extensa es la fragmentación del índice, puede trazar su plan de ataque con una de tres soluciones:reconstruir el índice, reorganizar el índice o no hacer nada.
Reconstruir: Reconstruya los índices cuando la fragmentación alcance más del 30 por ciento.
Reorganizar: Reorganice los índices con entre un 11 y un 30 por ciento de fragmentación.
Ignorar: Los niveles de fragmentación del 10 % o menos no deberían suponer un problema de rendimiento, por lo que no es necesario que haga nada.
La fragmentación del índice de SQL Server es inevitable, pero puede minimizar los efectos negativos de la fragmentación en el rendimiento de la base de datos. Siga algunas prácticas recomendadas simples y manténgase al tanto del mantenimiento programado para mitigar cualquier problema importante de rendimiento relacionado con la fragmentación.