Solución:
Existe un consenso general de que debe reorganizar (“desfragmentar”) sus índices tan pronto como la fragmentación del índice alcance más del 5 (a veces el 10%), y debe reconstruirlos por completo cuando supere el 30% (al menos esos son los números que ‘ he escuchado abogar en muchos lugares).
Michelle Ufford (también conocida como “SQL Fool”) tiene un script de desfragmentación de índice automatizado, que usa esos límites exactos para decidir cuándo reorganizar o reconstruir un índice.
Consulte también los consejos de Brad McGehee sobre la reconstrucción de índices con algunos buenos pensamientos y consejos sobre cómo lidiar con la reconstrucción de índices.
Utilizo este script aquí (no recuerdo cuándo me lo proporcionó, quienquiera que sea: ¡muchas gracias! Cosas realmente útiles) para mostrar la fragmentación del índice en todos sus índices en una base de datos determinada:
SELECT
t.NAME 'Table name',
i.NAME 'Index name',
ips.index_type_desc,
ips.alloc_unit_type_desc,
ips.index_depth,
ips.index_level,
ips.avg_fragmentation_in_percent,
ips.fragment_count,
ips.avg_fragment_size_in_pages,
ips.page_count,
ips.avg_page_space_used_in_percent,
ips.record_count,
ips.ghost_record_count,
ips.Version_ghost_record_count,
ips.min_record_size_in_bytes,
ips.max_record_size_in_bytes,
ips.avg_record_size_in_bytes,
ips.forwarded_record_count
FROM
sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, 'DETAILED') ips
INNER JOIN
sys.tables t ON ips.OBJECT_ID = t.Object_ID
INNER JOIN
sys.indexes i ON ips.index_id = i.index_id AND ips.OBJECT_ID = i.object_id
WHERE
AVG_FRAGMENTATION_IN_PERCENT > 0.0
ORDER BY
AVG_FRAGMENTATION_IN_PERCENT, fragment_count
¡”Cuando lo necesite” y “Cuando pueda”!
Por ejemplo…
-
Primero pruebe la fragmentación y decida si no hacer nada, reorganizar o reconstruir. El script de SQL Fool hace esto, por ejemplo, tiene
@minFragmentation
y@rebuildThreshold
parámetros -
Haga estadísticas a diario, digamos, pero índices los fines de semana. ¿Cuál es su ventana de mantenimiento?
Debe reconstruir los índices con la suficiente frecuencia para que la producción no se vea afectada negativamente por la degradación del índice. Entiendo que esto parece vago, pero todas las bases de datos son diferentes y se utilizan de diferentes maneras. Solo necesita reconstruir / desfragmentar regularmente los índices que incurren en operaciones de escritura (inserciones / actualizaciones); sus tablas estáticas o principalmente de solo lectura no necesitarán mucha reindexación.
Necesitarás usar dbcc showcontig([Table])
para comprobar el nivel de fragmentación de sus índices, determinar con qué frecuencia se fragmentan y en qué nivel se encuentra realmente la fragmentación.
Usar dbcc dbreindex([Table])
para reconstruir totalmente los índices cuando se vuelven demasiado fragmentados (por encima del 20% -30% más o menos), pero si no puede encontrar una ventana de tiempo de inactividad lo suficientemente grande y el nivel de fragmentación es relativamente bajo (1% -25%), debe usar dbcc indexdefrag([Database], [Table], [Index])
para desfragmentar el índice en una fascinación “en línea”. También tenga en cuenta que puede detener la operación de desfragmentación de índice y volver a iniciarla más tarde sin perder ningún trabajo.
Mantener una base de datos y sus índices “en sintonía” requiere un poco de supervisión para tener una idea de cuándo y qué reindexar.