Voici une procédure simplissime pour défragmenter les index fragmentés de SQL Server et recalculer toutes les statistiques. En prime, trois petites fonctions de méta données…
Retrouve le nom d’un index par son identifiant d’objet + identifiant d’index
CREATE FUNCTION dbo.sys_INDEX_NAME(@oid INT, @iid INT)
RETURNS sysname
AS
BEGIN
RETURN (SELECT DISTINCT I.name
FROM sys.indexes AS I
WHERE I.object_id = @oid
AND I.index_id = @iid);
END;
GO
Retrouve le nom de schéma associé à un objet
CREATE FUNCTION dbo.sys_SCHEMA_NAME(@oid INT)
RETURNS sysname
AS
BEGIN
RETURN (SELECT DISTINCT S.name
FROM sys.schemas AS S
INNER JOIN sys.objects AS O
ON S.schema_id = O.schema_id
WHERE O.object_id = @oid);
END;
GO
Retrouve le nom complet d’un objet (schéma + nom)
CREATE FUNCTION dbo.sys_COMPLETE_NAME(@oid INT)
RETURNS NVARCHAR(257)
AS
BEGIN
RETURN (SELECT DISTINCT dbo.sys_SCHEMA_NAME(@oid) +'.'
+ OBJECT_NAME(@oid));
END;
GO
Reconstruction des index fragmentés
DECLARE @SQL VARCHAR(max);
SET @SQL '';
SELECT @SQL = @SQL + 'ALTER INDEX ' + dbo.sys_INDEX_NAME(object_id, index_id) +' ON ' +
dbo.sys_COMPLETE_NAME(object_id) + ' REBUILD;'
FROM sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, NULL)
WHERE avg_fragmentation_in_percent > 15
AND page_count > 8
EXEC (@SQL);
Ici nous avons choisit des index de plus de 8 pages et dont la fragmentation est de plus de 15%
Recalcul de toutes les stats
DECLARE @SQL VARCHAR(max);
SET @SQL '';
SELECT 'UPDATE STATISTICS [' + TABLE_SCHEMA + '].[' + TABLE_NAME +'] WITH FULLSCAN, ALL;'
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYEP = 'BASE TABLE';
EXEC (@SQL);
--------
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 * * * * *
Ou si on est un peu feignante (comme moi), on laisse faire le free ware et c’est tout défragmenté: http://www.diskeeper.com/trialware/TrialwareProducts.aspx ca fait aussi server SLQ
Par contre, si ca continue de ramer il faut regarder du côté des potentiellement paramètres non-affectés par la défrag (CPU, RAM, video, bande passante, etc)