Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Supprimer et recréer automatiquement les index actuels

J'ai un script que j'utilise pour interroger les tables système afin de capturer tous les index non clusterisés et de désactiver puis de reconstruire à la fin. Le ci-dessous est à utiliser sur l'édition standard, si vous êtes en entreprise, j'ajouterais le ONLINE option.

Désactiver

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)

Reconstruire

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

J'aime cette méthode car elle est très personnalisable car vous pouvez exclure/inclure certaines tables en fonction des conditions tout en évitant un curseur. Vous pouvez également modifier le EXEC à un PRINT et voir le code qui va s'exécuter et l'exécuter manuellement.

Condition pour exclure une table

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