Saltar al contenido
DBAExperts
SQL Server Operación

Cómo actualizar estadísticas y reconstruir índices en SQL Server

Con el tiempo los indices se fragmentan y las estadisticas se desactualizan, y el rendimiento cae. Este mantenimiento periodico lo mantiene sano.

  1. 1

    Mide la fragmentacion de los indices

    Antes de actuar, mide. sys.dm_db_index_physical_stats te dice el porcentaje de fragmentacion de cada indice.

    SELECT OBJECT_NAME(ips.object_id) AS tabla,
           i.name AS indice,
           ips.avg_fragmentation_in_percent AS frag_pct,
           ips.page_count AS paginas
    FROM sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, 'LIMITED') ips
    JOIN sys.indexes i ON ips.object_id = i.object_id AND ips.index_id = i.index_id
    WHERE ips.page_count > 1000
    ORDER BY frag_pct DESC;
  2. 2

    Reorganiza o reconstruye segun el umbral

    Regla practica: menos de 5% no hagas nada; entre 5% y 30% REORGANIZE (operacion ligera, online); mas de 30% REBUILD (mas pesado pero deja el indice como nuevo).

    -- Fragmentacion moderada: reorganizar
    ALTER INDEX IX_Ventas_Fecha ON dbo.Ventas REORGANIZE;
    
    -- Fragmentacion alta: reconstruir
    ALTER INDEX IX_Ventas_Fecha ON dbo.Ventas
    REBUILD WITH (ONLINE = ON);  -- ONLINE requiere Enterprise
  3. 3

    Actualiza las estadisticas

    Las estadisticas guian al optimizador. Si estan viejas, elige planes malos. REBUILD ya las actualiza; tras un REORGANIZE hazlo aparte.

    -- Todas las estadisticas de una tabla con muestreo completo
    UPDATE STATISTICS dbo.Ventas WITH FULLSCAN;
    
    -- O de toda la base
    EXEC sp_updatestats;
  4. 4

    Automatiza con una solucion probada

    En vez de reinventar el mantenimiento, usa una solucion madura como la de Ola Hallengren, que decide reorganizar/reconstruir por umbral automaticamente.

    -- Ejemplo con los scripts de Ola Hallengren (IndexOptimize)
    EXEC dbo.IndexOptimize
      @Databases = 'USER_DATABASES',
      @FragmentationLow = NULL,
      @FragmentationMedium = 'INDEX_REORGANIZE',
      @FragmentationHigh = 'INDEX_REBUILD_ONLINE,INDEX_REBUILD_OFFLINE',
      @UpdateStatistics = 'ALL';

// el error común

REBUILD OFFLINE bloquea la tabla mientras corre: no lo programes en horario de operacion salvo que uses ONLINE (solo Enterprise). Reconstruir indices genera mucho log: en modelo FULL puede inflar el log y disparar respaldos. No hagas mantenimiento agresivo diario si no lo necesitas; mide primero.

// cuándo conviene un experto

Un plan de mantenimiento mal calibrado consume recursos, llena el log o bloquea la operacion. En dba.mx configuramos mantenimiento por umbrales, en ventanas seguras y con monitoreo, con techo cerrado para que rinda sin estorbar.

Agenda un Escaneo — desde USD $550

Esta guía es orientativa y usa comandos de referencia. En producción, adapta a tu versión y prueba en un ambiente seguro primero.