¿El tiempo de reconstrucción del índice depende del nivel de fragmentación?

8

¿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_percentnivel 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_countvalor a mis grabaciones, del siguiente diagrama.

Luego corrí: Alter index ... Rebuild with (online=on); y agarré el CPU timeusando STATISTICS TIME ONen 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.

Fragmentación de índice y reconstrucción de estadísticas de tiempo de CPU

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 .

Magier
fuente

Respuestas:

2

¿El tiempo requerido para la reconstrucción del índice depende del nivel de fragmentación?

Creo que este no será el parámetro principal sobre el cual decidirá el servidor SQL y toma tiempo reconstruir \ reorganizar el índice:

Hay varios otros factores involucrados en función de "DATOS" a través de los cuales decide cuánto tiempo llevará: Parámetros como

Factor 1: tamaño de la mesa

Factor 2: preocupaciones de disponibilidad

Factor 3: Particionamiento

Factor 4: columnas de índice y unicidad

Si desea leer más sobre estos factores, puede consultar aquí .

¿La reconstrucción de un índice fragmentado al 80% tarda aproximadamente 2 minutos si la reconstrucción del mismo índice fragmentado al 40% dura 1 minuto?

De nuevo, la respuesta puede ser ¡Depende! Para los números, deberá probar el escenario y ver los resultados de cómo va. Haga un seguimiento de detalles como FRAG nivel 80, la reconstrucción tomó X hrs \ mins \ secs y para Frag nivel 40, la reconstrucción tomó Y hrs \ mins \ secs. Calcule y conserve el historial durante más de 15 días (depende de la actividad de mantenimiento programada) y puede llegar a una conclusión sobre cuánto tiempo lleva realmente comparar los dos.

Adicionalmente :

Puede recopilar los datos \ cálculo en el progreso de reconstrucción del índice:

ya sea utilizando DMV sys.dm_exec_requests O

Si tiene planes de mantenimiento de Ola para re-indexar-reorganizar, hay una opción para guardar el historial de las acciones realizadas durante el mantenimiento dentro de la tabla CommandLog como se explica en el índice de SQL Server y el mantenimiento de estadísticas . Una vez que se guardan los datos, puede consultar el tipo de comando `ALTER_INDEX - REBUILD 'y la diferencia para el mismo entre las columnas HORA DE INICIO y HORA DE FIN

KASQLDBA
fuente
@KASQLDBA Entré en las estadísticas / registro de la tabla CommandLog de Ola. La duración es muy muy aleatoria y no hay relación con el nivel de fragmentación reconocible. Dado que tengo esos valores solo en un entorno de producción, el tiempo requerido para la reconstrucción puede estar muy influenciado por otros procesos, por lo que esto parece no ofrecer una respuesta general.
Magier
8

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. Duración de reconstrucción del índice

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. ingrese la descripción de la imagen aquí

Magier
fuente
6

REBUILDde í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.

Stoleg
fuente
4

¿La reconstrucción de un índice fragmentado al 80% tarda aproximadamente 2 minutos si la reconstrucción del mismo índice fragmentado al 40% tarda 1 minuto?

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:

  • Puede usar múltiples CPU: puede aprovechar el paralelismo para hacer el trabajo rápidamente.
  • Para índices muy fragmentados (por ejemplo, 80% como en su ejemplo), un RECONSTRUCCIÓN será mucho más rápido que un REORG. REBUILD solo creará otra copia del índice vs REORG se atascará en la eliminación de la fragmentación y, por lo tanto, será más lento. Esta es la razón por la que Paul Randal dio su recomendación general de que sería bueno RECONSTRUIR un índice muy fragmentado.
  • Un RECONSTRUCCIÓN le permitirá cambiar el modo de recuperación a BULK_LOGGED para un registro mínimo allí al generar menos registros de registro .

Para el índice REORG:

  • Siempre es de un solo hilo. Sin paralelismo.
  • Es más lento para índices muy fragmentados y más rápido para índices ligeramente fragmentados. El costo de crear un índice frente a reorganizar un índice ligeramente fragmentado es mayor y, por lo tanto, un REORG será más rápido para un índice ligeramente fragmentado.
  • Un REORG es siempre una operación completamente registrada.

Siga leyendo - Notas - Fragmentación, tipos y soluciones de índices de SQL Server

Kin Shah
fuente
Kin, TY por tu comentario, pero siento que has supervisado el núcleo de mi pregunta. Estás comparando reorg vs reconstruir. Pregunté acerca de una comparación de reconstrucción vs. reconstrucción para diferentes niveles de fragmentación (ceteris paribus).
Magier
@Magier, si relees cuidadosamente mi respuesta, responde a tu pregunta principal: si un índice está muy fragmentado, reconstruirlo. El costo de hacer una reconstrucción de un poco fragmentado es mucho más que hacer una reorganización. Además, no hay una forma correcta o incorrecta de abordar la fragmentación haciendo una reconstrucción o reorganización, todo depende de la disponibilidad del sistema, los datos, el tamaño del índice, el subsistema de E / S del disco, etc. También puede realizar fácilmente algunas pruebas según su entorno para comparar reconstrucción versus reconstrucción para diferentes niveles de fragmentación. No puedes
Kin Shah
Nunca pregunté ni mencioné sobre REORG. Se trata de RECONSTRUCCIÓN. Y sí, claro, podría configurar pruebas e intentar crear niveles de fragmentación específicos para averiguar cuánto tiempo llevará la reconstrucción, pero quería ver si alguien ya lo sabe y puede decirme los resultados esperados de ese enfoque.
Magier
3

Sé que es un hilo viejo, pero creo que será beneficioso compartir la publicación de Paul Randal aquí.

Velocidad del algoritmo

Una reconstrucción de índice siempre generará un nuevo índice, incluso si no hay fragmentación. El tiempo que demora la reconstrucción está relacionado con el tamaño del índice, no con la cantidad de fragmentación que contiene.

https://www.sqlskills.com/blogs/paul/sqlskills-sql101-rebuild-vs-reorganize/

Elvin Ahmadov
fuente
0

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.

¿La reconstrucción de un índice fragmentado al 80% tarda aproximadamente 2 minutos si la reconstrucción del mismo índice fragmentado al 40% tarda 1 minuto?

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.

usr
fuente
@Magier buena investigación. El tiempo de CPU nunca se ve afectado por la fragmentación. Está probando pequeñas tablas que están completamente en caché en la memoria para que no haya IO de lectura en absoluto. La prueba no es válida. Prueba con tablas más grandes (como 100 MB) y hazlo CHECKPOINT; DBCC DROPCLEANBUFFERSantes 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.
Usr
También tenga en cuenta que el número de fragmentación es una especie de indicador flojo porque lo que realmente cuenta es el movimiento del cabezal del disco físico. Puedo imaginar muchos patrones de E / S que son razonablemente rápidos pero tienen una fragmentación del 100% según la medición de SQL Server utilizando su definición limitada. Por ejemplo, el patrón de asignación 1_2_3_4 donde se escanea 1-4 y _ es un agujero debe ser rápido.
Usr
¿Qué valor tengo que mirar exactamente? Realmente obtengo la siguiente información de Reconstruir: Tiempo de CPU = 0 ms, tiempo transcurrido = 70 ms. Tabla 'tFrag2'. Cuenta de escaneo 4, lecturas lógicas 512067, lecturas físicas 26, lecturas anticipadas 71209, lecturas lógicas lob 0, lecturas físicas lob 0, lecturas anticipadas lob 0. Tiempos de ejecución del servidor SQL: Tiempo de CPU = 8657 ms, tiempo transcurrido = 27246 em. Tiempos de ejecución de SQL Server: tiempo de CPU = 8657 ms, tiempo transcurrido = 27386 ms.
Magier
¿Son estos tiempos de 3 consultas? Es un poco confuso. Se puede decir desde los primeros números que se almacenan muchos datos en caché. También 70 ms es demasiado corto para un punto de referencia válido. ¿Puedes aclarar qué representan esos números?
Usr
Las veces que mencioné vinieron de STATISTICS_TIME y STATISTICS_IO. Voy a reiniciar un nuevo punto de referencia en este momento y esta vez quiero tener los resultados adecuados. Así que cualquier otra sugerencia es muy bienvenida. No entiendo lo que ayuda a limpiar la memoria caché de datos, ya que estoy interesado en recuperar los datos rápidamente, pero reconstruir el índice, ¿qué, afaik, hay que hacer en el disco de todos modos?
Magier