Regenerar indices... un tema interesante
La optimización de indices no es solamente la acción de regenerar indices, primero se debe de analizar cuales indices deben ser reorganizados y cuales reconstruidos.
Para tomar una desición primero debemos conocer el nivel de fragmentación de los indices. Si el porcentaje de fragmentación es menor o igual al 30% la mejor práctica es reorganizar los indices. Si el porcentaje es mayor al 30% reconstruir los índices.
Ahora, para conocer el porcentaje de fragmentación de un índices podemos utilizar el método del sistema
sys.dm_db_index_physical_stats
Aquí te construí un select en el que hago join con sys.indexes, para obtener el porcentaje de fragmentación de los índices de la tabla Product de la base de datos que viene de ejemplo en sql server 2005 AdventureWorks:
Código PHP:
SELECT a.index_id, name, avg_fragmentation_in_percent
FROM sys.dm_db_index_physical_stats (DB_ID('AdventureWorks'),
OBJECT_ID('Production.Product'), NULL, NULL, NULL) AS a
JOIN sys.indexes AS b ON a.object_id=b.object_id AND a.index_id=b.index_id
Luego, dependiendo de lo que muestre el select puedes hacerle un reorganize o un rebuild a los índices.
Para hacer un reorganize:
ALTER INDEX <NombreIndice> ON <NombreTabla> REORGANIZE
Para reorganizar todos los índices de una tabla, de una manera rápida la podemos hacer así:
ALTER INDEX ALL ON <NombreTabla>
Para hacer un rebuild:
ALTER INDEX <NombreIndice> ON <NombreTabla> REBUILD
Reorganizar un indice desfragmentado lo que hace es reordenar el nivel de hoja del indice clustered o nonclustered en las tablas físicas para tener las páginas de nivel de hoja en su orden lógico original, que es de izquierda a derecha. Reorganizar indices tambien compacta las páginas de indice, las paginas vacias creadas serán eliminadas. La compactación es basada en el valor del llamado FILL FACTOR que la podemos ver en la vista del sistema sys.indexes, pero bue... ese ya es otro tema.
Hacerle un rebuild al indice es dropearlo y crear uno nuevo. Al hacer esto, la fragmentación es eliminada y las paginas de indices son también son compactadas logrando liberar espacio.
Una herramienta útil es el Database Engine Tuning Advisor, hay mucho que hablar, se podría hacer un tema y ponerlo en las FAQS.
Espero haber sido de ayuda y que el tiempo tomado en escribir este post no haya sido escrito en vano.
Saludos Cordiales