sql >> Base de Datos >  >> RDS >> Sqlserver

Descartar y recrear automáticamente los índices actuales

Tengo una secuencia de comandos que uso para consultar las tablas del sistema para capturar todos los índices no agrupados y deshabilitarlos y luego reconstruirlos al finalizar. Lo siguiente es para usar en la edición estándar, si está en la empresa, agregaría ONLINE opción.

Deshabilitar

DECLARE @sql AS VARCHAR(MAX);
SET @sql = '';
SELECT 
    @sql = @sql + 'ALTER INDEX [' + i.name + '] ON [' + o.name + '] DISABLE; '
FROM sys.indexes AS i
JOIN sys.objects AS o ON i.object_id = o.object_id
WHERE i.type_desc = 'NONCLUSTERED'
AND o.type_desc = 'USER_TABLE'

EXEC (@sql)

Reconstruir

DECLARE @sql AS VARCHAR(MAX);
SET @sql = '';
SELECT 
    @sql = @sql + 'ALTER INDEX [' + i.name + '] ON [' + o.name + '] REBUILD WITH (FILLFACTOR = 80); '
FROM sys.indexes AS i
JOIN sys.objects AS o ON i.object_id = o.object_id
WHERE i.type_desc = 'NONCLUSTERED'
AND o.type_desc = 'USER_TABLE'

EXEC (@sql);

Me gusta este método porque es muy personalizable, ya que puede excluir/incluir ciertas tablas según las condiciones, así como evitar un cursor. También puedes cambiar el EXEC a un PRINT y ver el código que se ejecutará y ejecutarlo manualmente.

Condición para excluir una tabla

AND o.name NOT IN ('tblTest','tblTest1');