IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Administration SQL Server Discussion :

Maintenance des indexes et statistiques


Sujet :

Administration SQL Server

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2012
    Messages : 44
    Points : 39
    Points
    39
    Par défaut Maintenance des indexes et statistiques
    Bonjour,

    aujourd'hui, notre stratégie de gestion des indexes consiste à exécuter la procédure suivante tous les dimanches soir:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
     
            declare @cmd 		varchar(1000)
    	declare @nomBase 	varchar(255)
    	declare @mStatus	int
     
    	declare tmpO cursor for select name from master..sysdatabases
    				where name not in ('master', 'model', 'msdb', 'tempdb', 'redirection','ReportServerTempDB', 'ReportServer')
    	open tmpO
    	while 1 = 1 
    		begin
    			fetch next from tmpO into @nomBase
    			if @@fetch_status <> 0 break
    			begin
    				select @mStatus = status  from master..sysdatabases
    							where name = @nomBase
    				print @nomBase + '  '+ cast(@mStatus as varchar(10))
     
    				print '------------------------------ '+ @nomBase + ' - start ---------------------------'
    				select @cmd = 'exec '+ @nomBase +'.dbo.admin_UpdateStatistics '
    				exec(@cmd)
    				print '------------------------------ '+ @nomBase + ' - ok ---------------------------'
    				print '  '
    			end
    		end
    	close tmpO
    	deallocate tmpO
     
     
     
    	create procedure [dbo].[admin_UpdateStatistics]
    	as
     
    	begin transaction ReCreationIndexes
     
    	-- regÚnÚration des indexes 
    	declare @tableName varchar(500)
    	declare @cmd varchar(300)
    	declare tmpC cursor for select TABLE_NAME from INFORMATION_SCHEMA.TABLES where TABLE_TYPE = 'BASE TABLE'
     
    	open tmpC
    	while 1 = 1 
    		begin
    			fetch next from tmpC into @tableName
    			if @@fetch_status <> 0 break
    			begin
    				set @cmd = 'DBCC DBREINDEX ('''+ @tableName + ''')'
    				execute (@cmd)
    			end
    		end
    	close tmpC
    	deallocate tmpC
     
    	commit transaction ReCreationIndexes
     
     
    	-- update statistics
    	declare tmpD cursor for select TABLE_NAME from INFORMATION_SCHEMA.TABLES where TABLE_TYPE = 'BASE TABLE'
     
    	open tmpD
    	while 1 = 1 
    		begin
    			fetch next from tmpD into @tableName
    			if @@fetch_status <> 0 break
    			begin
    				set @cmd =  'update statistics ' + @tableName	
    				execute (@cmd)
    			end
    		end
    	close tmpD
    	deallocate tmpD
     
    	-- recompilation des proc. stockÚs.
    	declare tmpE cursor for select TABLE_NAME from INFORMATION_SCHEMA.TABLES
     
    	open tmpE
    	while 1 = 1 
    		begin
    			fetch next from tmpE into @tableName
    			if @@fetch_status <> 0 break
    			begin
    				set @cmd =  'sp_recompile ' + @tableName	
    				execute (@cmd)
    			end
    		end
    	close tmpE
    	deallocate tmpE

    Celle ci a été développé sur sqlserver2000 et n'est pas maintenu.

    je pense qu'elle doit être revu mais j'aimerais pouvoir argumenter ce point.
    Voici divers points/interrogations :
    • Pas d’exécution OnLine, du coup nous ne rafraichissons les indexes qu'une fois par semaine le dimanche soir (période creuse) car en semaine cela perturbe les batchs de nuit.

    • tous les indexes sont reconstruits que ce soit nécessaire ou non.

    • DBCC DBREINDEX est obsolète. Mais si dans l’immédiat nous restons sur sqlserver2008, y a-t-il des inconvénients à garder cette instruction?

    • on recompile toutes les procédures stockés systématiquement alors que la doc mssql indique:
      SQL Server recompile automatiquement les procédures stockées et les déclencheurs quand il est avantageux de le faire.
      Je pense donc que ce n'est pas nécessaire.


    Pourriez vous confirmer ou corriger les points relevés et compléter la liste?


    Pour remplacer notre procédure, j'ai recherché sur le net, j'ai trouvé 2 procédures :



    Pourriez vous me faire un retour d’expérience sur ces 2 procédures?

    Merci d'avance.

    Cdt.

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 897
    Points : 53 135
    Points
    53 135
    Billets dans le blog
    6
    Par défaut
    Effectivement il n'est pas logique de défragmenter des index non fragmentés. L'usage veut d'étudier la fragmentation, uis de :
    • reconstruire si fragmentation supérieure à 30%
    • réorganiser si fragmentation supérieure à 10%

    Tout en gardant à l'esprit qu'il n'y a aucun intérêt à défragmenter de petits index (moins de 16 pages par exemple) car ils eront toujours vues comme fragmentés alors qu'ils ne le sont pas !

    La fragmentation des index à peu d'importance sur les performances, mais plus sur les volumétries (sauvegardes notamment).

    Enfin, il faut recalculer les statistiques pour les stats qui sont "décalées".
    Ceci est en revanche très important pour les performances.

    MAIS... Le fait de reconstruire un index recalcule les stats en mode FULL SCAN
    Le fait de les réorganiser les les stats en l'état.

    En version 2008, vous ne pouvez que savoir depuis quand les stats ont été recalculer à l'aide de la fonction STAT_DATE()...

    À partir de la version 2008 R2 SP2, vous pouvez utiliser la fonction table sys.dm_db_stats_properties qui permet de voir le "décalage" d'estimation à l'aide des colonnes rows_sampled/modification_counter

    L'utilisation du mode ONLINE de rconstruction des index nécessite la version Enterprise.

    Pour des algo simple de maintenance, voir ce que je propose :
    http://blog.developpez.com/sqlpro/p8...des_index_et_s
    http://blog.developpez.com/sqlpro/p9...de_stockage_et
    La première est ce que je met chez tous mes clients et permet de voir l'activité de maintenance à long terme (par exemple la dérive de reconstruction de certains index...)

    En ce qui concerne la recompilation, c'est une mauvaise chose, car vous allez obtenir l'effet inverse de celui souhaité : remplir le cache avec des choses peu usitées au détriment de celles largement usités. Donc s'abstenir.

    Enfin, il est indispensable de vérifier l'intégrité physique de vos bases à la même fréquence que vos sauvegardes completes !

    A +

  3. #3
    Membre expérimenté

    Homme Profil pro
    Auditeur informatique
    Inscrit en
    Novembre 2014
    Messages
    816
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Auditeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2014
    Messages : 816
    Points : 1 354
    Points
    1 354
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    Effectivement il n'est pas logique de défragmenter des index non fragmentés. L'usage veut d'étudier la fragmentation, uis de :

    Tout en gardant à l'esprit qu'il n'y a aucun intérêt à défragmenter de petits index (moins de 16 pages par exemple) car ils eront toujours vues comme fragmentés alors qu'ils ne le sont pas


    A +
    merci Sql pro pour cette explication

    mis j'ai une petit doute sur le nbre 16 pages ,plusieurs personne recommande 1024 pages comme limite

    Que penser vous ?

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 897
    Points : 53 135
    Points
    53 135
    Billets dans le blog
    6
    Par défaut
    16 pages est un strict minimum.

    N'oubliez pas que défragmenter par REBUILD => recalcul des stats

    A +

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2012
    Messages : 44
    Points : 39
    Points
    39
    Par défaut
    Merci pour votre retours.
    je garde vos réponses sous le coude et je testerais ça dès que possible.

    Cdt.

  6. #6
    Expert confirmé
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573
    Points : 4 043
    Points
    4 043
    Par défaut
    Bonjour,

    J'ajoute : le script d'Ola Hallengren est très bon et souvent utilisé.

  7. #7
    Membre expérimenté
    Homme Profil pro
    DBA SQL Server
    Inscrit en
    Octobre 2012
    Messages
    862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA SQL Server
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2012
    Messages : 862
    Points : 1 736
    Points
    1 736
    Par défaut
    Je confirme les propos de Mr Bruchez :-)

    Je les mis en place sur toutes nos instances dans tous les environnements. C'est facile à mettre en place et ça fonctionne très bien.

Discussions similaires

  1. [2008R2] Gestion des indexes et statistiques
    Par Mothership dans le forum Administration
    Réponses: 6
    Dernier message: 14/03/2013, 12h35
  2. Procédure de maintenance des index et ANSI_WARNINGS
    Par elsuket dans le forum MS SQL Server
    Réponses: 0
    Dernier message: 23/03/2012, 10h34
  3. [12.5] Maintenance des indexes
    Par bossun dans le forum Adaptive Server Enterprise
    Réponses: 3
    Dernier message: 22/03/2010, 14h33
  4. Statistiques et efficacité des index
    Par ApokalypS dans le forum Administration
    Réponses: 5
    Dernier message: 05/08/2009, 09h45
  5. Statistiques des indexs sur tables temporaires
    Par gaboo_bl dans le forum Administration
    Réponses: 3
    Dernier message: 24/07/2009, 17h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo