J'utilise ce script. Veuillez noter que je vous conseillerais de lire sur le dmv que j'utilise ici, ils sont un joyau caché dans SQL2005 +.
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
CREATE TABLE #FragmentedIndexes
(
DatabaseName SYSNAME
, SchemaName SYSNAME
, TableName SYSNAME
, IndexName SYSNAME
, [Fragmentation%] FLOAT
)
INSERT INTO #FragmentedIndexes
SELECT
DB_NAME(DB_ID()) AS DatabaseName
, ss.name AS SchemaName
, OBJECT_NAME (s.object_id) AS TableName
, i.name AS IndexName
, s.avg_fragmentation_in_percent AS [Fragmentation%]
FROM sys.dm_db_index_physical_stats(db_id(),NULL, NULL, NULL, 'SAMPLED') s
INNER JOIN sys.indexes i ON s.[object_id] = i.[object_id]
AND s.index_id = i.index_id
INNER JOIN sys.objects o ON s.object_id = o.object_id
INNER JOIN sys.schemas ss ON ss.[schema_id] = o.[schema_id]
WHERE s.database_id = DB_ID()
AND i.index_id != 0
AND s.record_count > 0
AND o.is_ms_shipped = 0
DECLARE @RebuildIndexesSQL NVARCHAR(MAX)
SET @RebuildIndexesSQL = ''
SELECT
@RebuildIndexesSQL = @RebuildIndexesSQL +
CASE
WHEN [Fragmentation%] > 30
THEN CHAR(10) + 'ALTER INDEX ' + QUOTENAME(IndexName) + ' ON '
+ QUOTENAME(SchemaName) + '.'
+ QUOTENAME(TableName) + ' REBUILD;'
WHEN [Fragmentation%] > 10
THEN CHAR(10) + 'ALTER INDEX ' + QUOTENAME(IndexName) + ' ON '
+ QUOTENAME(SchemaName) + '.'
+ QUOTENAME(TableName) + ' REORGANIZE;'
END
FROM #FragmentedIndexes
WHERE [Fragmentation%] > 10
DECLARE @StartOffset INT
DECLARE @Length INT
SET @StartOffset = 0
SET @Length = 4000
WHILE (@StartOffset < LEN(@RebuildIndexesSQL))
BEGIN
PRINT SUBSTRING(@RebuildIndexesSQL, @StartOffset, @Length)
SET @StartOffset = @StartOffset + @Length
END
PRINT SUBSTRING(@RebuildIndexesSQL, @StartOffset, @Length)
EXECUTE sp_executesql @RebuildIndexesSQL
DROP TABLE #FragmentedIndexes
Gardez également à l'esprit que ce script peut s'exécuter un certain temps et bloquer l'accès à vos tables. À moins que vous n'ayez les éditions Enterprise, SQL peut VERROUILLER la table lors de la reconstruction de l'index. Cela bloquera toutes les requêtes vers cette table en utilisant l'index jusqu'à ce que la défragmentation de l'index soit terminée. Ainsi, il n'est pas conseillé d'exécuter la reconstruction d'index pendant les heures de fonctionnement uniquement pendant les fenêtres de maintenance. Si vous utilisez l'édition entreprise, vous pouvez utiliser l'option ONLINE=ON pour défragmenter les index en ligne. Cela utilisera plus d'espace mais vos tables ne seront pas bloquées/verrouillées pendant l'opération de défragmentation.
Criez si vous avez besoin de plus d'informations.
MISE À JOUR :
Si vous exécutez cette requête sur une base de données plus petite, vous pouvez probablement utiliser le paramètre 'DETAILED' dans l'appel à sys.dm_db_index_physical_stats. Il s'agit probablement d'un examen plus détaillé des index. La discussion dans les commentaires soulignera également que sur des tables beaucoup plus grandes, il vaut probablement la peine de faire une analyse SAMPLED car cela aidera à réduire le temps nécessaire pour effectuer l'analyse de l'index.