En environnement de développement (en espérant que vous ne le faites pas en production …), il arrive assez souvent de lancer des compactages (SHRINK) de bases de données. Mais ce type d’action a tendance à fragmenter tous les index, chose qu’il convient de réparer rapidement si l’on souhaite garder des performances acceptables.
Or il n’existe pas d’instruction Transact-SQL ou de commande (menu) sous SSMS permettant de reconstruire rapidement tous les index d’une base. Voici donc un script réalisant cela (avec accessoirement mise à jour complète des statistiques en fin de processus) :
declare @requete nvarchar(max)=N'' select @requete+='ALTER INDEX ALL ON ' + QUOTENAME(s.name) + '.' + QUOTENAME(t.name) + ' REBUILD;' from sys.tables t join sys.schemas s on s.schema_id=t.schema_id where t.is_memory_optimized=0 exec sp_executesql @requete exec sp_updatestats
Un oeil aguerri pourra constater que ce filtre exclut volontairement les tables « In-Memory » de SQL Server 2014, étant donné qu’il n’est pas utile de défragmenter ce type de tables.
Vite réalisé, mais bien utile lorsque l’on n’a pas la possibilité de passer par un plan de maintenance ou lorsqu’il n’est pas nécessaire de chercher à s’appuyer sur les taux de fragmentation comme dans un script standard de maintenance …
Bonjour, j’obtiens une erreur (instance SQL2008, Studio 2014) :
Msg 207, Niveau 16, État 1, Ligne 6
Nom de colonne non valide : ‘is_memory_optimized’.
merci !!
Bonjour,
Effectivement, la colonne is-memory_optimized est associée à une fonctionnalité non disponible en version 2008 de SQL Server.
Vous pouvez tout simplement enlever (ou mettre en commentaire) la ligne de la clause WHERE, et tout devrait bien se passer sous votre version de SQL Server.
J’attire toutefois votre attention sur le fait que la version 2008 n’est plus supportée par Microsoft depuis l’été dernier, et qu’il est conseillé de mettre à jour votre système vers une version plus récente.
Bonne journée.