Désactiver les index d’une table le temps d’un traitement, pour les réactiver ensuite est souvent payant, notamment lors d’insertion massive de lignes dans les tables. Voici quelques scripts pour faire ce travail…
1 – désactiver tous les index non sémantiques d’une base :
DECLARE @CMD NVARCHAR(max);
SET @CMD = '';
SELECT @CMD = @CMD + 'ALTER INDEX [' + i.name
+ '] ON [' + s.name + '].[' + o.name + '] DISABLE;'
+ CHAR(13) + CHAR(10)
FROM sys.indexes AS i
INNER JOIN sys.objects AS o
ON i.object_id = o.object_id
INNER JOIN sys.schemas AS s
ON o.schema_id = s.schema_id
WHERE i.is_primary_key = 0 -- pas les primary keys
AND i.is_unique = 0 -- pas les index unique
AND i.is_unique_constraint = 0 -- pas les contraintes unique
AND i.is_hypothetical = 0 -- pas les index hypothétique
AND i.index_id > 0 -- pas les tables en HEAP
AND o.type_desc IN ('USER_TABLE',
'VIEW'); -- uniquement les tables et les vues
SELECT @CMD; -- pour verification
EXEC (@CMD); -- exécution du lot de commande
2 – réactiver les index désactivés par reconstruction avec un facteur de remplissage de 90
DECLARE @CMD NVARCHAR(max);
SET @CMD = '';
SELECT @CMD = @CMD + 'ALTER INDEX [' + i.name
+ '] ON [' + s.name + '].[' + o.name
+ '] REBUILD WITH (FILLFACTOR = 90);'
+ CHAR(13) + CHAR(10)
FROM sys.indexes AS i
INNER JOIN sys.objects AS o
ON i.object_id = o.object_id
INNER JOIN sys.schemas AS s
ON o.schema_id = s.schema_id
WHERE i.is_disabled = 1;
SELECT @CMD; -- pour verification
EXEC (@CMD); -- exécution du lot de commande
--------
Frédéric Brouard, SQLpro - ARCHITECTE DE DONNÉES, http://sqlpro.developpez.com/
Expert bases de données relationnelles et langage SQL. MVP Microsoft SQL Server
www.sqlspot.com : modélisation, conseil, audit, optimisation, tuning, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *