¿Cuándo debo reconstruir índices?

Respuestas:

41

A riesgo de ser demasiado general en mi respuesta, diré que debe ejecutar un proceso de mantenimiento de índice regularmente. Sin embargo, su proceso de mantenimiento de índice solo debe reconstruir / reorganizar los índices que lo requieren específicamente.

Esto presenta la pregunta: ¿cuándo se debe reconstruir o reorganizar un índice? Rolando tocó esto muy bien. Nuevamente, me arriesgo a ser extremadamente amplio. Un índice requiere mantenimiento cuando el nivel de fragmentación afecta negativamente el rendimiento. Este nivel de fragmentación podría variar según el tamaño y la composición del índice.

Hablando para SQL Server, tiendo a elegir un tamaño de índice y un nivel de fragmentación del índice, en cuyo punto empiezo a realizar el mantenimiento del índice. Si un índice contiene menos de 100 páginas, no realizaré mantenimiento.

Si un índice está entre 10% y 30% fragmentado, haré REORGANIZEel índice y UPDATElas estadísticas. Si un índice está fragmentado en más de un 30%, lo haré REBUILD, con no UPDATE STATISTICS, ya que esto se encarga de esto REBUILD. Sin embargo, recuerde que una reconstrucción solo actualiza el objeto de estadísticas directamente asociado con el índice. Otras estadísticas de columna deberán mantenerse por separado.

Esta respuesta es realmente un largo camino para decir: Sí, debe realizar un mantenimiento de índice de rutina, pero solo en los índices que lo necesitan.

Matt M
fuente
19

¿Cuándo debo reconstruir los índices en mi base de datos relacional (por ejemplo, SQL Server)?

Debería reconstruir los índices cuando se vuelvan muy fragmentados por eventos especiales. Por ejemplo, realiza una gran carga de datos en una tabla indexada.

¿Existe algún caso para reconstruir índices de manera regular?

Entonces, ¿qué pasa si sus índices se fragmentan regularmente debido a la actividad regular? ¿Debería programar reconstrucciones regulares? ¿Con qué frecuencia deberían correr?

Tom Kyte , en este hilo clásico de Ask Tom , recomienda:

El lapso de tiempo entre las reconstrucciones de índice debe ser aproximadamente PARA SIEMPRE.

...

No sé cómo decirlo mejor: el índice quiere ser grande y gordo con espacio adicional. Está en una columna que actualiza, moviendo la entrada de índice de un lugar a otro en el índice. Un día, la fila tiene un código de "A", al día siguiente el código es "G", luego "Z", luego "H" y así sucesivamente. Entonces, la entrada de índice para la fila se mueve de un lugar a otro en el índice. Mientras lo hace, necesita espacio, si el espacio no está allí, dividiremos el bloque en dos, y haremos espacio. Ahora el índice está engordando. Con el tiempo, el índice es 2-3 veces el tamaño que tenía cuando comenzó y está "medio vacío o más", pero eso está bien ya que mueve las filas. Ahora, cuando movemos las filas, ya no tenemos que dividir bloques para hacer espacio: la habitación ya está disponible.

Luego viene y reconstruye o suelta y vuelve a crear el índice (que tiene los mismos efectos, solo que la reconstrucción es "más segura") no tiene la posibilidad de perder el índice y puede ser más rápido ya que el índice puede ser reconstruido por escanear el índice existente en lugar de escanear la tabla y ordenar y construir un índice nuevo). Ahora, todo ese lindo espacio se ha ido. Comenzamos el proceso de dividir los bloques nuevamente, llevándonos de vuelta a donde comenzamos.

No ahorraste espacio.

El índice está de vuelta como estaba.

Simplemente estaría perdiendo el tiempo para reconstruirlo nuevamente, haciendo que este círculo vicioso se repita.

La lógica aquí es sólida, pero está sesgada en contra de un perfil de carga de lectura pesada.

Un índice "grueso" (es decir, uno con muchos espacios en blanco) realmente mantiene una buena cantidad de espacio para filas nuevas y movidas, reduciendo así las divisiones de página y manteniendo sus escrituras rápidas. Sin embargo, cuando lea de ese índice grueso tendrá que leer más páginas para obtener los mismos datos porque ahora está revisando más espacio vacío. Esto ralentiza tus lecturas.

Por lo tanto, en bases de datos con mucha lectura, desea reconstruir o reorganizar regularmente sus índices. (¿Con qué frecuencia y bajo qué condiciones? Matt M ya tiene una respuesta concreta a esta pregunta). En las bases de datos que experimentan una actividad de lectura y escritura más o menos equivalente, o en bases de datos que tienen mucha escritura, es probable que esté perjudicando el rendimiento de su base de datos al reconstruir índices regularmente.

Nick Chammas
fuente
11

La mayoría de las personas los reconstruyen de manera regular para que nunca lleguen a fragmentarse. Cuando necesita reconstruirlos se basa en la rapidez con que se fragmentan. Algunos índices deberán reconstruirse con frecuencia, otros básicamente nunca. Echa un vistazo a la secuencia de comandos que el SQLFool creó que maneja muchas de estas cosas por ti.

mrdenny
fuente
Solo para su información para los queridos lectores, el script de SQLFool no se ha actualizado en más de 5 años, por lo que es posible que no incorpore las nuevas campanas y silbatos cuando hace lo suyo.
LowlyDBA
De hecho, creo que la última vez que revisé el sitio (no puedo acceder a él ahora (puede que no sea una buena señal)), Michelle ya no estaba trabajando activamente en SQL Server y no tenía ninguna intención activa de seguir trabajando en el script . Si te funciona, ¡genial! Para nuevas instalaciones, considere los guiones de Ola Hallengren : he usado ambos, y no es una transición difícil.
RDFozz
7

Como se señaló en la respuesta aceptada de Matt M, una regla general común es que los índices que están fragmentados en más del 30% deben reconstruirse.

Esta consulta lo ayudará a encontrar cuántos índices tiene más del 30% de fragmentación (cuando tenga algunos, debe reconstruirlos):

SELECT DB_NAME() AS DBName,
       OBJECT_NAME(ind.object_id) AS TableName,
       ind.name AS IndexName,
       indexstats.index_type_desc AS IndexType,
       indexstats.avg_fragmentation_in_percent,
       indexstats.fragment_count,
       indexstats.avg_fragment_size_in_pages,
       SUM(p.rows) AS Rows 
  FROM sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, NULL) AS indexstats
         INNER JOIN sys.indexes AS ind ON (    ind.object_id = indexstats.object_id
                                           AND ind.index_id = indexstats.index_id)
         INNER JOIN sys.partitions AS p ON (    ind.object_id = p.object_id
                                            AND ind.index_id = p.index_id)
 WHERE indexstats.avg_fragmentation_in_percent > 30
 GROUP BY
       OBJECT_NAME(ind.object_id),
       ind.name,
       indexstats.index_type_desc,
       indexstats.avg_fragmentation_in_percent,
       indexstats.fragment_count,
       indexstats.avg_fragment_size_in_pages 
 ORDER BY indexstats.avg_fragmentation_in_percent DESC
amandamaddox3
fuente
1
Esto no proporciona una respuesta. La pregunta no es cómo encuentro índices con compresión "x", es "cuándo debo reconstruir índices".
Max Vernon
1
Esto no proporciona una respuesta a la pregunta. Una vez que tenga suficiente reputación , podrá comentar cualquier publicación ; en su lugar, proporcione respuestas que no requieran una aclaración del autor de la pregunta . - De la opinión
LowlyDBA
2
@ LowDDBA: puede haber sido un poco conciso, pero creo que responde a la pregunta y proporciona algo útil para la discusión. Lo he expandido un poco para explicar cómo. Amanda: si mi edición parece excesiva o incorrecta, ¡no dudes en revertirla!
RDFozz
Gracias RDFozz. Se ve bien. Sí, más del 30% fragmentado es hora de reconstruir.
amandamaddox3
5

¿Cuándo debo reconstruir índices?

Cuando el porcentaje de fragmentación del índice es superior al 30%.

¿Existe algún caso para reconstruir índices de manera regular?

No existe tal caso, pero en general, realizar el Mantenimiento del índice una vez por semana, durante el fin de semana, es la mejor práctica para mantener estable el entorno.

Recomendaría usar scripts de mantenimiento de Ola Hallengren (los mejores scripts de mantenimiento), personalizar los scripts según su entorno y programarlos para que se ejecuten durante el fin de semana.

https://ola.hallengren.com/

Nota: No olvide actualizar las estadísticas después de reconstruir índices, porque la reconstrucción de índices no actualiza todas las estadísticas.

KrishnaV
fuente
Estoy bastante seguro de que su nota es incorrecta. Una reconstrucción de índice actualiza las estadísticas. Un índice reorganizado no. Aunque solo actualiza las estadísticas de los objetos relacionados con el índice, no todas las estadísticas. Dicho esto, también recomiendo actualizar las estadísticas con frecuencia para reducir la posibilidad de desaceleración debido a la detección de parámetros y los malos planes de consulta debido a estadísticas desactualizadas.
bmg002
1

Como con la mayoría de las cosas en TI, depende. ¿Qué problema estás tratando de solucionar haciendo índices de reconstrucción? ¿Puedes demostrar que realmente soluciona el problema? Si es así, modifique los números hasta que encuentre la menor cantidad de mantenimiento que necesita hacer para solucionar el problema.

Si no soluciona el problema, o la razón por la que lo está haciendo es solo para apaciguar algunas métricas que monitorea porque podrían mejorar las cosas, entonces todo lo que está haciendo es quemar CPU e IO y posiblemente empeorar su problema.

Hay un argumento de que arreglar la fragmentación no hará ninguna diferencia en su servidor, entonces, ¿vale la pena hacerlo regularmente?

https://www.brentozar.com/archive/2017/12/index-maintenance-madness/

http://brentozar.com/go/defrag

Greg
fuente