1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
   | USE MA_BASE; --> remplacer MA_BASE par le nom de votre base
GO
 
--> 1) sauvegarde FULL de la base
BACKUP DATABASE MA_BASE TO DISK = 'BACKUP_MA_BASE_BEFORE INDEX.BAK' WITH COMPRESSION; --> remplacer MA_BASE par le nom de votre base
 
--> 2) journalisation en mode simple de la base
ALTER DATABASE MA_BASE SET RECOVERY SIMPLE;
 
--> 3) défragmentation, reconstruction intelligente
DECLARE @SQL NVARCHAR(max) = N''
SELECT @SQL = @SQL + 
       CASE 
          WHEN i.name IS NULL 
             THEN N'ALTER TABLE ' + QUOTENAME(s.name) + N'.' + QUOTENAME(o.name) + N' REBUILD;'
          WHEN avg_fragmentation_in_percent < 30 
             THEN N'ALTER INDEX ' + QUOTENAME(i.name) + N' ON ' + QUOTENAME(s.name) + '.' + QUOTENAME(o.name) + ' REORGANIZE;'
             ELSE N'ALTER INDEX ' + QUOTENAME(i.name) + N' ON ' + QUOTENAME(s.name) + '.' + QUOTENAME(o.name) + ' REBUILD;'
       END + ' BACKUP LOG MA_BASE TO DISK = ''NUL'';' --> remplacer MA_BASE par le nom de votre base
FROM   sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL , NULL) AS ips
       JOIN sys.objects AS o ON ips.object_id = o.object_id
       JOIN sys.schemas AS s ON s.schema_id = o.schema_id
       JOIN sys.indexes AS i ON ips.object_id = i.object_id AND ips.index_id = i.index_id
WHERE  page_count > 64 
       AND avg_fragmentation_in_percent > 10;
       PRINT @SQL
EXEC (@SQL);
GO
 
--> 4) création des index manquant selon seuil de gain
DECLARE @SQL NVARCHAR(max) = N'';
WITH 
T AS
(
SELECT d.*, 
       ROW_NUMBER() OVER (ORDER BY avg_user_impact * avg_total_user_cost DESC) AS INDICE,
       COUNT(*) OVER() AS NBR
FROM   sys.dm_db_missing_index_details AS d
       JOIN sys.dm_db_missing_index_groups AS g
          ON d.index_handle = g.index_handle
       JOIN sys.dm_db_missing_index_group_stats AS s
          ON g.index_group_handle = s.group_handle
WHERE  d.database_id = DB_ID()
)
SELECT @SQL = @SQL 
       + N'CREATE INDEX X_gunnar_' + N'_' + CAST(NEWID() AS VARCHAR(38))
       + N'_' + CONVERT(CHAR(8), CURRENT_TIMESTAMP, 112) 
       + N' ON ' + statement 
       + ' (' + COALESCE(T.equality_columns + ', ' + T.inequality_columns, 
                         T.equality_columns,         T.inequality_columns) + ')' 
       + CASE WHEN included_columns IS NULL THEN N''
              ELSE ' INCLUDE (' + included_columns + ')' END + ';' 
       + N' BACKUP LOG MA_BASE TO DISK = ''NUL'';' --> remplacer MA_BASE par le nom de votre base
FROM   T 
WHERE  INDICE <= NBR / 2;
EXEC (@SQL);
 
 
--> 5) journalisation en mode full de la base
ALTER DATABASE MA_BASE SET RECOVERY FULL; --> remplacer MA_BASE par le nom de votre base
 
--> 6) nouvelle sauvegarde FULL de la base
BACKUP DATABASE MA_BASE TO DISK = 'BACKUP_MA_BASE AFTER INDEX.BAK' WITH COMPRESSION; --> remplacer MA_BASE par le nom de votre base | 
Partager