Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Elimina e ricrea automaticamente gli indici correnti

Ho uno script che utilizzo per interrogare le tabelle di sistema per acquisire tutti gli indici non cluster e disabilitare quindi ricostruire al termine. Quanto segue è per l'uso sull'edizione standard, se sei in azienda aggiungerei il ONLINE opzione.

Disattiva

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)

Ricostruisci

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);

Mi piace questo metodo in quanto è molto personalizzabile in quanto puoi escludere/includere determinate tabelle in base alle condizioni ed evitare un cursore. Inoltre puoi cambiare il EXEC a un PRINT e vedere il codice che verrà eseguito ed eseguirlo manualmente.

Condizione per escludere una tabella

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