Rafraichissement des index et statistiques d’une base

Le recalcul des index et des statistiques est une opération très utile après une migration de base de données d’un version de serveur à l’autre. En effet, le moteur relationnel évoluant, les statistiques (sous-jacente ou non aux index) ne sont pas forcément calculées de la même manière. Il est alors bon de reconstruire tous les index et de remettre à jours les statiques pour celles hors index. Voici deux petit scripts pour ce faire.

Mise à jour des index :


USE [MaBase];
ALTER DATABASE [MaBase] SET RECOVERY SIMPLE;
GO
DECLARE @T NVARCHAR(261), @I sysname, @SQL VARCHAR(max);
DECLARE C CURSOR  
   LOCAL FORWARD_ONLY STATIC READ_ONLY
   FOR SELECT '[' + c.name +'].['+ o.name +']' AS T, i.name AS I
       FROM   sys.indexes AS i
              INNER JOIN sys.objects AS o
                    ON o.object_id = i.object_id
              INNER JOIN sys.schemas AS c
                    ON o.schema_id = c.schema_id
       WHERE  o."type" IN ('U', 'V');
OPEN C;
FETCH C INTO @T, @I;
WHILE @@FETCH_STATUS = 0
BEGIN
   SET @SQL = 'ALTER INDEX ' + COALESCE('[' + @I + ']', 'ALL')  
            + ' ON ' + @T + ' REBUILD WITH (FILLFACTOR = 90);'
   EXEC (@SQL);
   FETCH C INTO @T, @I;
END
CLOSE C;
DEALLOCATE C;
GO
ALTER DATABASE [MaBase] SET RECOVERY FULL;

Mise à jour des statistiques :


USE [MaBase];
ALTER DATABASE [MaBase] SET RECOVERY SIMPLE;
GO
DECLARE @T NVARCHAR(261), @S sysname, @SQL VARCHAR(max);
DECLARE C CURSOR  
   LOCAL FORWARD_ONLY STATIC READ_ONLY
   FOR SELECT '[' + c.name +'].['+ o.name +']' AS T, a.name AS S
       FROM   sys.stats AS a
              INNER JOIN sys.objects AS o
                    ON o.object_id = a.object_id
              INNER JOIN sys.schemas AS c
                    ON o.schema_id = c.schema_id
       WHERE  o."type" IN ('U', 'V')
         AND  auto_created = 1
         AND  user_created = 0;
OPEN C;
FETCH C INTO @T, @S;
WHILE @@FETCH_STATUS = 0
BEGIN
   SET @SQL = 'UPDATE STATISTICS '  + @T +' [' + @S + '] WITH FULLSCAN;'
   EXEC (@SQL);
   FETCH C INTO @T, @S;
END
CLOSE C;
DEALLOCATE C
GO
ALTER DATABASE [MaBase]SET RECOVERY FULL;

--------
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  * * * * *

MVP Microsoft SQL Server

Laisser un commentaire