Primero, es importante considerar si la fragmentación es importante.
Si su consulta solo realiza búsquedas de una sola fila, es posible que no note ninguna fragmentación. En las SAN modernas, el almacenamiento en caché a nivel de SAN puede hacer que las E / S físicas sean lo suficientemente rápidas como para que la fragmentación no importe. En SSD, el patrón de E / S aleatorio causado por el escaneo de un índice fragmentado en realidad puede resultar en un mejor rendimiento que los datos no fragmentados.
Muchas veces, las personas notan que reconstruir un índice solucionó un problema de rendimiento. La reconstrucción de un índice también genera estadísticas nuevas. Puede darse el caso de que la solución real sean estadísticas nuevas, no la reconstrucción del índice. UPDATE STATISTICS...WITH FULLSCAN
puede ser una forma más barata, más rápida y menos intrusiva de resolver el mismo problema de rendimiento.
Si no tiene problemas causados por la fragmentación, podría estar gastando mucho tiempo y esfuerzo sin obtener ganancias reales.
En segundo lugar, hay dos tipos de fragmentación:
Fragmentación física Esto es lo que piensa la mayoría de la gente cuando piensa en la fragmentación. Las páginas están fuera de servicio y deben reordenarse. Al escanear un índice, este tipo de fragmentación a veces puede ser un problema. En general, he notado que esto tiene el mayor impacto en el rendimiento con lecturas físicas . Si está viendo los resultados sys.dm_db_index_physical_stats
, este número es la avg_fragmentation_in_percent
columna.
Fragmentación de baja densidad. Esta fragmentación es causada por páginas que solo están parcialmente llenas de datos. Tiene baja densidad de datos porque sus datos se distribuyen en más páginas de las necesarias. Como resultado, leer los datos requiere más E / S porque los datos se distribuyen en más páginas de las necesarias. Esto puede afectar tanto las lecturas lógicas como físicas. Si está viendo los resultados sys.dm_db_index_physical_stats
, este número es la avg_page_space_used_in_percent
columna. Esta columna solo se completa cuando se usa el modo SAMPLED
o DETAILED
.
Entonces, ¿qué haces al respecto?
Fragmentación física : si simplemente persigue números altos avg_fragmentation_in_percent
, considere realmente si está perdiendo el tiempo. Asegúrese de tener una consulta real que tenga un rendimiento deficiente y use un entorno de prueba para confirmar que está solucionando un problema eliminando la fragmentación.
Puede abordar la fragmentación física haciendo ALTER INDEX...REORGANIZE
. La REORGANIZE
operación está en línea, moviendo las páginas de una en una para reorganizarlas nuevamente en orden físico. Si elimina una REORGANIZE
declaración a mitad de camino, cualquier trabajo que ya se haya realizado se mantiene: solo se revertirá la página que se está moviendo actualmente. Hacer una REORGANIZE
tabla grande que esté muy fragmentada puede requerir más espacio total de registro de transacciones, y en modo de recuperación completa puede generar una cantidad significativa de copias de seguridad del registro de transacciones. También puede llevar más tiempo para REORGANIZE
un índice altamente fragmentado que para REBUILD
él.
A menudo verá consejos para realizar un REBUILD
índice altamente fragmentado, en lugar de un REORGANIZE
: esto se debe a que la reconstrucción desde cero puede ser más eficiente. Sin embargo, la reorganización puede ser una operación "más en línea" y a veces se prefiere, incluso para índices altamente fragmentados.
La fragmentación de baja densidad no puede ser reparada por REORGANIZE
. Solo se puede solucionar haciendo un ALTER INDEX...REBUILD
. Al hacer el índice con ONLINE=ON
, debería poder minimizar el bloqueo. Sin embargo, REBUILD
todavía necesita tomar un candado por un momento para intercambiar el índice antiguo por el nuevo índice. En un sistema muy ocupado, lograr este bloqueo exclusivo a veces puede ser un problema. Debería poder confirmar si tiene este problema utilizando algo como sp_whoisactive para examinar el bloqueo durante su reconstrucción y mirando los detalles de los bloqueos y esperas. Usar la WAIT_AT_LOW_PRIORITY
opción puede ser útil si sabe que hay un próximo período de baja utilización, y su reconstrucción puede "colarse" para este intercambio cuando la actividad cae lo suficiente como para alcanzar ese bloqueo. Tenga en cuenta que un largo plazoREBUILD
La operación también será una transacción abierta de larga duración. Las transacciones abiertas de larga duración pueden tener sus propios problemas, relacionados con el uso / reutilización del registro de transacciones. Si está utilizando duplicación o grupos de disponibilidad, también hay consideraciones para rehacer el registro de transacciones en la réplica secundaria.
REORGANIZE
reducirá la fragmentación de la página de la hoja y el espacio compactoREBUILD
, de manera menos eficiente. ¿Estás seguro de que el gran tamaño se debe a la fragmentación? ¿Cuál es el factor de relleno?