1 - Il faut commencer par défragmenter les tables et index, par exemple avec le script suivant, exécuté dans le contexte de votre base :
1 2 3 4 5 6 7 8
| DECLARE @SQL NVARCHAR(max) = N'';
SELECT @SQL = @SQL +'ALTER ' + CASE WHEN i.name IS NULL THEN 'TABLE' ELSE 'INDEX [' + i.name + '] ON' END
+ N' [' + o.name + '] REBUILD;'
FROM sys.objects AS o
JOIN sys.schemas AS s ON o.schema_id = s.schema_id
JOIN sys.indexes AS i ON o.object_id = i.object_id
WHERE o.type IN ('U', 'V');
EXEC (@SQL); |
2 - Ensuite vous pouvez tenter de réduire l'espace de stockage, à l'aide du script suivant (toujours dans le contexte de la base) :
1 2 3 4
| DECLARE @SQL2 NVARCHAR(max) = N'';
SELECT @SQL2 = @SQL2 + N'DBCC SHRINKFILE('''+ name +''', 1);'
FROM sys.database_files;
EXEC (@SQL2); |
Si cela ne suffit pas...
3 - vous pouvez passer votre base en mode de récupération SIMPLE et refaire la réduction (toujours dans le contexte de la base) :
ALTER DATABASE CURRENT SET RECOVERY SIMPLE;
Si versions antérieure à 2012, mettez le nom de la base à la pace de CURRENT
Si cela n'est toujours pas suffisant et que vous êtes en édition Enterprise ou en version 2016 Sp1 et postérieure…
4 - vous pouvez compressez toutes vos données. Pour cela exécutez le script suivant, exécuté dans le contexte de votre base :
1 2 3 4 5 6 7 8
| DECLARE @SQL3 NVARCHAR(max) = N''
SELECT @SQL3 = @SQL3 + 'ALTER ' + CASE WHEN i.name IS NULL THEN 'TABLE' ELSE 'INDEX [' + i.name + '] ON' END
+ N' [' + o.name + '] REBUILD WITH (DATA_COMPRESSION = PAGE);'
FROM sys.objects AS o
JOIN sys.schemas AS s ON o.schema_id = s.schema_id
JOIN sys.indexes AS i ON o.object_id = i.object_id
WHERE o.type IN ('U', 'V');
EXEC (@SQL3); |
Et pour en savoir plus, lisez notre livre :

A +
Partager