Comme la source précédente :
-
http://sqlfr.com/code.aspx?ID=35836
Il y a des cas (system 24*7 par exemple), où la reconstruction des indexes est impossible. En effet, cette reconstruction commence par la suppression des indexes existant. Ainsi, cela peut pénaliser créellement les utilisateurs à ce moment.
Il est donc plus simple de faire une défragmentation des Indexes existant.
Voila donc la Procédure stockée faisant cela.
Source / Exemple :
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO
ALTER PROCEDURE dbo.SP_System_DefragdAllIndexes
/*
Permet de défragmentation des Indexes
de toutes les bases du serveur SQL Server
AS
DECLARE @name sysname
DECLARE @Objectname sysname
DECLARE @Username sysname
DECLARE @IndexName sysname
DECLARE @LaRequette varchar(8000)
DECLARE @DateJour varchar(20)
SET @DateJour = REPLACE(CONVERT(VARCHAR, GetDate(), 102), '.', '_')
PRINT '---------------------------------------------------------------------'
PRINT ' DATE DE LA MISE A JOUR DES INDEXES LANCEE : '+ @DateJour
PRINT '---------------------------------------------------------------------'
DECLARE TESTCURSEUR CURSOR
FOR SELECT Master.dbo.sysdatabases.name FROM Master.dbo.sysdatabases
WHERE Master.dbo.sysdatabases.name NOT IN ('tempdb', 'model', 'pubs', 'master', 'msdb', 'LVM')
ORDER BY Master.dbo.sysdatabases.name
OPEN TESTCURSEUR
FETCH NEXT FROM TESTCURSEUR
INTO @name
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT ''
PRINT '---------------------------------------------------------------------'
PRINT ' DEFRAGMENTATION DES INDEXES DE LA BASE : '+ @name
PRINT '---------------------------------------------------------------------'
SET @LaRequette = 'SELECT USR.name AS UserName, O.name AS Objectname, IDX.name IndexName
FROM '+ @name +'.dbo.sysobjects O INNER JOIN '+ @name +'.dbo.sysusers USR
ON O.uid = USR.uid INNER JOIN '+ @name +'.dbo.sysindexes IDX
ON O.id = IDX.id WHERE (O.xtype= ''U'' OR O.xtype= ''V'')
AND NOT (IDX.keys IS NULL) AND NOT (IDX.status & 64 = 64);'
PRINT 'Changement de base : '+ @LaRequette
PRINT '---------------------------------------------------------------------'
EXEC('DECLARE TESTCURSEURTABLE CURSOR FOR '+ @LaRequette)
OPEN TESTCURSEURTABLE
FETCH NEXT FROM TESTCURSEURTABLE
INTO @Username, @Objectname, @IndexName
WHILE @@FETCH_STATUS = 0
BEGIN
SET @LaRequette = 'DBCC INDEXDEFRAG ('''+ @name +''', '''+ @Username+'.'+ @Objectname +''', '''+ @IndexName +''')'
PRINT 'Requette : '+ @LaRequette
EXECUTE (@LaRequette)
PRINT '---------------------------------------------------------------------'
FETCH NEXT FROM TESTCURSEURTABLE
INTO @Username, @Objectname, @IndexName
END
CLOSE TESTCURSEURTABLE
DEALLOCATE TESTCURSEURTABLE
SET @LaRequette = 'USE '+ @name +' exec sp_updatestats'
PRINT 'Requette : '+ @LaRequette
EXECUTE (@LaRequette)
FETCH NEXT FROM TESTCURSEUR
INTO @name
END
PRINT '---------------------------------------------------------------------'
PRINT ' FIN DE LA DEFRAGMENTATION
PRINT '---------------------------------------------------------------------'
CLOSE TESTCURSEUR
DEALLOCATE TESTCURSEUR
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
Conclusion :
En espérant que cette SP vous rende service.
Bon coding
Romelard Fabrice (Alias F___)
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.