Sql server - procédure stockée permettant de reconstruire tous les indexes de toutes les bases du serveur

Soyez le premier à donner votre avis sur cette source.

Snippet vu 18 234 fois - Téléchargée 27 fois

Contenu du snippet

Dans le même esprit que la source précédente :
- http://www.sqlfr.com/code.aspx?ID=29623

Voila une seconde qui permet de reconstruire intégralement les indexes de toutes les bases utilisatrices du server SQL.

Source / Exemple :


------------------------------------------------------------------------------------------------------ 
CREATE PROCEDURE dbo.SP_System_RebuildAllIndexes 
/* 
    Permet de reconstruire les Indexes 
     de toutes les bases du serveur SQL Server 

  • /
AS DECLARE @name sysname DECLARE @nameTable 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 STATISTIQUES 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') OPEN TESTCURSEUR FETCH NEXT FROM TESTCURSEUR INTO @name WHILE @@FETCH_STATUS = 0 BEGIN PRINT '' PRINT '---------------------------------------------------------------------' PRINT ' RECONSTRUCTION DES INDEXES DE LA BASE : '+ @name PRINT '---------------------------------------------------------------------' SET @LaRequette = 'SELECT ''[''+ U.name +''].[''+ O.name +'']'' AS name FROM ['+ @name +'].dbo.sysobjects O INNER JOIN ['+ @name +'].dbo.sysusers U ON O.uid = U.uid WHERE O.xtype= ''U'' OR O.xtype= ''V'' AND O.name NOT IN (''syssegments'', ''sysconstraints'') AND NOT(O.name LIKE ''%#%'') ;' PRINT 'Changement de base : '+ @LaRequette PRINT '---------------------------------------------------------------------' EXEC('DECLARE TESTCURSEURTABLE CURSOR FOR '+ @LaRequette) OPEN TESTCURSEURTABLE FETCH NEXT FROM TESTCURSEURTABLE INTO @nameTable WHILE @@FETCH_STATUS = 0 BEGIN SET @LaRequette = 'DBCC DBREINDEX (''['+ @name +'].'+ @nameTable +''', '''', 100)' PRINT 'Requette : '+ @LaRequette EXECUTE (@LaRequette) PRINT '---------------------------------------------------------------------' FETCH NEXT FROM TESTCURSEURTABLE INTO @nameTable END CLOSE TESTCURSEURTABLE DEALLOCATE TESTCURSEURTABLE FETCH NEXT FROM TESTCURSEUR INTO @name END PRINT '---------------------------------------------------------------------' PRINT ' FIN DE LA RECONSTRUCTION' PRINT '---------------------------------------------------------------------' CLOSE TESTCURSEUR DEALLOCATE TESTCURSEUR GO ------------------------------------------------------------------------------------------------------ -- Elle est utilisable avec la commande suivante : exec dbo.SP_System_RebuildAllIndexes

Conclusion :


En espérant que cette SP vous rende service.

Bon coding

Romelard Fabrice (Alias F___)

A voir également

Ajouter un commentaire

Commentaires

dymsbess
Messages postés
56
Date d'inscription
mercredi 29 septembre 2004
Statut
Membre
Dernière intervention
4 janvier 2010
1 -
Pour éviter le curseur sur les bases de données, vous pouvez également utiliser la procédure stockées suivante : EXEC master.sys.sp_MSforeachdb 'USE[?]; SELECT * FROM sysobjects'

http://www.xoowiki.com/Article/SQL-Server/multi-bases-de-donnees-33.aspx
Arthenius
Messages postés
1183
Date d'inscription
mercredi 21 janvier 2004
Statut
Membre
Dernière intervention
6 septembre 2011
12 -
j'utilise moi aussi ce bout de code pour reindexer mes tables, par contre j'ai passer le fillfactor a 80 et modifier la requete :
# SET @LaRequette = 'SELECT ''[''+ U.name +''].[''+ O.name +'']'' AS name
# FROM ['+ @name +'].dbo.sysobjects O INNER JOIN ['+ @name +'].dbo.sysusers U
# ON O.uid = U.uid WHERE O.xtype= ''U'' OR O.xtype= ''V''
# AND O.name NOT IN (''syssegments'', ''sysconstraints'')
# AND NOT(O.name LIKE ''%#%'') ;'

en

# SET @LaRequette = 'SELECT ''[''+ U.name +''].[''+ O.name +'']'' AS name
# FROM ['+ @name +'].dbo.sysobjects O INNER JOIN ['+ @name +'].dbo.sysusers U
# ON O.uid = U.uid WHERE O.xtype= ''U''
# AND O.name NOT IN (''syssegments'', ''sysconstraints'')
# AND NOT(O.name LIKE ''%#%'') ;'

Pour ne pas prendre en compte les View de ma BDD
sinon chouette boulot
merci :)
dominique.stock
Messages postés
446
Date d'inscription
vendredi 7 novembre 2003
Statut
Membre
Dernière intervention
8 octobre 2008
3 -
Bonjour,
J'utilise cette fonction sur 6.5 pour certains index, faites quand même attention au fillfactor !! qui est ici paramétré à 100 par défaut.

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.