¿El tiempo requerido para la reconstrucción del índice depende del nivel de fragmentación?
¿La reconstrucción de un índice fragmentado del 80% tarda aproximadamente 2 minutos si la reconstrucción del mismo índice fragmentado del 40% dura 1 minuto?
Estoy solicitando el TIEMPO DE EJECUCIÓN (por ejemplo, en segundos) que puede requerirse para realizar la acción requerida, no sobre qué acción se requiere en qué situación particular. Soy consciente de las mejores prácticas básicas cuando se deben realizar reorganizaciones de índice o reconstruir / actualizaciones estadísticas.
Esta pregunta NO pregunta sobre REORG y la diferencia entre REORG y REBUILD.
El trasfondo: Debido a la configuración de diferentes trabajos de mantenimiento de índices (cada noche, trabajos más pesados los fines de semana ...), me preguntaba si un trabajo de mantenimiento de índice OFFLINE "ligero intenso" diario debería realizarse mejor en índices fragmentados bajos-medios para mantener el tiempos de inactividad pequeños, o ni siquiera importa, y la reconstrucción en un índice fragmentado al 80% puede tomar el mismo tiempo de inactividad que la misma operación en el mismo índice fragmentado al 40%.
Seguí las sugerencias y traté de descubrir qué estaba pasando. Mi configuración experimental: en un servidor de prueba que no hacía NADA más y no lo usaba nadie ni nada más, creé una tabla con un Índice agrupado en una columna de clave primaria de identificador único con algunas columnas adicionales y diferentes tipos de datos [2 números, 9 fecha y hora, y 2 varchar (1000)] y simplemente agregar filas. Para la prueba presentada agregué unas 305,000 filas.
Luego usé un comando de actualización y actualicé al azar un rango de filas que se filtran en un valor entero y cambié una de las columnas VarChar con un valor de cadena cambiante para crear fragmentación. Después de eso, verifiqué el avg_fragmentation_in_percent
nivel actual sys.dm_db_index_physical_stats
. Cada vez que creé una "nueva" fragmentación para mi punto de referencia, agregué este valor, incluido el physical_page_count
valor a mis grabaciones, del siguiente diagrama.
Luego corrí: Alter index ... Rebuild with (online=on);
y agarré el CPU time
usando STATISTICS TIME ON
en mis grabaciones.
Mis expectativas: esperaba ver al menos la indicación de un tipo de curva lineal que muestre una dependencia entre el nivel de fragmentación y el tiempo de CPU.
Este no es el caso. No estoy seguro de si este procedimiento es realmente apropiado para un buen resultado. ¿Quizás el número de filas / páginas es demasiado bajo?
Sin embargo, los resultados indican que la respuesta a mi pregunta original definitivamente sería NO . Parece que el tiempo de CPU requerido que SQL Server necesita para reconstruir el índice no depende del nivel de fragmentación ni del recuento de páginas del índice subyacente.
El primer gráfico muestra el tiempo de CPU requerido para RECONSTRUIR el índice en comparación con el nivel de fragmentación anterior. Como puede ver, la línea promedio es relativamente constante y no existe una relación observable entre la fragmentación y el tiempo de CPU requerido.
Para respetar la posible influencia del número cambiante de páginas en el índice después de mis actualizaciones que podrían requerir más o menos tiempo para reconstruir, calculé el NIVEL DE FRAGMENTACIÓN * PÁGINAS CONTADO y usé este valor en el segundo gráfico que muestra la relación del tiempo de CPU requerido vs. fragmentación y recuento de páginas.
Como puede ver, esto tampoco indica que el tiempo requerido para la reconstrucción esté influenciado por la fragmentación, incluso si el número de páginas varía.
Después de hacer esas declaraciones, supongo que mi procedimiento debe estar equivocado porque el tiempo de CPU requerido para reconstruir un índice enorme y altamente fragmentado solo puede estar influenciado por el número de filas, y realmente no creo en esta teoría.
Entonces, debido a que realmente y definitivamente quiero descubrir esto ahora, cualquier comentario y recomendación son bienvenidos .
Para todos los interesados, he creado un gráfico que muestra la duración del índice RECONSTRUCCIÓN de aproximadamente 2500 reconstrucciones del índice en un par de semanas en relación con la fragmentación del índice y su tamaño en páginas.
Estos datos se basan en 10 servidores SQL, cientos de tablas y en los procedimientos de optimización de Ola Hallengren . El umbral general para la reconstrucción se establece en 5% de fragmentación.
He cortado algunas de las tablas más grandes (10 páginas Mi +) en estas estadísticas para que sea más legible.
El cuadro muestra el tiempo requerido (duración) como tamaño de las burbujas. Los valores más grandes de la burbuja son unos 220 segundos. Muestra que el tiempo requerido para reconstruir un índice no está realmente relacionado con la fragmentación. En cambio, parece ser más dependiendo de la cantidad de páginas que tenga el índice. También indica que la fragmentación de bajo nivel consume más tiempo que la fragmentación más alta.
El segundo gráfico acaba de acercarse al área <= 200 K páginas. Muestra lo mismo, lleva más tiempo para índices más grandes, no para más fragmentación.
fuente
REBUILD
de índice no depende de la fragmentación. Se cae el índice por completo y lo crea desde cero.REORGANZE
index: es para reducir la fragmentación sin la reconstrucción del índice, por lo que no se debe descartar ni crear.MS aconseja usar Reorganize para un 30% de fragmentación o menos. Para una mayor fragmentación, se prefiere la reconstrucción.
Aquí está el artículo de MSDN sobre esto: Reorganización y reconstrucción de índices
ACTUALIZAR
En términos del tiempo necesario para completar la operación, obviamente depende de la fragmentación del índice. Reconstruir un índice enormemente fragmentado llevará menos tiempo que reorganizarse; La reconstrucción del índice ligeramente fragmentado llevará mucho más tiempo. Sugeriría tomar las pautas de MS como punto de partida y ejecutar algunas pruebas en sus tablas. El punto de equilibrio en términos de% de fragmentación dependerá de la tabla específica, el tamaño del índice y el tipo de datos.
fuente
El algoritmo para REBUILD vs REORG es diferente. Un REORG NO asignará nuevas extensiones en lugar de un RECONSTRUCCIÓN. Un REORG funcionará con las páginas asignadas actualmente (asigna una página aleatoria de 8Kb para que pueda mover las páginas) y las mueve y luego desasigna las páginas si es necesario.
De mis notas internas de SQLSkills (anteriormente IE0) notas ...
Para RECONSTRUCCIÓN:
Para el índice REORG:
Siga leyendo - Notas - Fragmentación, tipos y soluciones de índices de SQL Server
fuente
Sé que es un hilo viejo, pero creo que será beneficioso compartir la publicación de Paul Randal aquí.
https://www.sqlskills.com/blogs/paul/sqlskills-sql101-rebuild-vs-reorganize/
fuente
Sí, porque generalmente una reconstrucción necesita escanear el índice original en orden mientras transmite las filas (en orden) a una nueva partición de índice físico. La fragmentación perjudica los escaneos no almacenados en caché, por lo que sí, la reconstrucción llevará más tiempo.
Cuánto tiempo más depende de la fragmentación y de cómo la CPU está unida a todo el proceso. La serialización de filas es bastante intensiva en la CPU, por lo que podría no importar en absoluto. O bien, es posible que obtenga tasas de E / S aleatorias de 1.5 MB / seg, que es fácilmente 5-10 veces más lenta de lo que sería una reconstrucción rápida (depende del esquema y los datos). Dependiendo de las suposiciones que haga, probablemente pueda idear cualquier cosa entre una desaceleración de 1x y 100x.
No es una relación lineal. La métrica de fragmentación es un proxy muy aproximado de cuánto tiempo lleva escanear una partición.
fuente
CHECKPOINT; DBCC DROPCLEANBUFFERS
antes de cada prueba. También estoy interesado en ver los resultados. Una vez hice una prueba similar donde medí la velocidad de escaneo dependiendo de la fragmentación, pero no recuerdo el resultado.