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

MS SQL Server Discussion :

Auto défragmentation des index - problème


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    240
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2008
    Messages : 240
    Par défaut Auto défragmentation des index - problème
    Je dispose d'un scrip T-SQL permettant de lister, parmis tous les index de la base de données, les index fragmentés et ensuite les défragmenter.

    J'utilise les colonnes ScanDensity et ExtentFrag retrounée par l'instruction DBCC SHOWCONTIG. Lorsque la valeur de ScanDentity est < 92 et la valeur ExtentFrag est > 10, l'index est défragmenté.

    Je joue aussi avec le taux de remplissage afin que les index souvent sollicités par des opérations d'insertion et de mise à jour ne se fragmentent pas trop vite.

    Cependant, il reste un problème résiduel avec cette défragmentation. Lors la défragmentation d'un index, certaines requêtes sollicitant l'index en question provoque des blocages, allongeant ainsi la durée de défragmentation, et provoquant des problèmes lors de l'exécution des requêtes.

    Existe-t'il une possibilité, lorsque la défragmentation d'un index dure trop de temps, de l'avorter ? Où alors, existe-t'il des méthodes afin d'éviter ce genre d'inconvéniants ?

    D'avance, merci.

    Philippe Deltour

  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 994
    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 994
    Billets dans le blog
    6
    Par défaut
    Je dispose d'un scrip T-SQL permettant de lister, parmis tous les index de la base de données, les index fragmentés et ensuite les défragmenter.
    bien !

    J'utilise les colonnes ScanDensity et ExtentFrag retrounée par l'instruction DBCC SHOWCONTIG. Lorsque la valeur de ScanDentity est < 92 et la valeur ExtentFrag est > 10, l'index est défragmenté.
    Limite beaucoup trop serrée. En efffet exiger un tel taux est parfois STRICTEMENT IMPOSSIBLE. Donc certains index physiquement non fragmentés seront reconstruit par votre méthode alors quils n'on pas besoin de l'être.
    En particulier pour un tout petit index (moins de 20 pages) ou alors pour des index sur des tables ayant de très grandes lignes (à partir de 2000 octets).

    Je joue aussi avec le taux de remplissage afin que les index souvent sollicités par des opérations d'insertion et de mise à jour ne se défragmentent pas trop vite.
    C'est une bonne chose.

    Cependant, il reste un problème résiduel avec cette défragmentation. Lors la défragmentation d'un index, certaines requêtes sollicitant l'index en question provoque des blocages, allongeant ainsi la durée de défragmentation, et provoquant des problèmes lors de l'exécution des requêtes.
    C'est pourquoi cette tâche doit être planifiée aux heures creuses et se limiter aux index réellement fragmentés. De plus vous pouvez utiliser des techniques moins agressive que la réindexation (REBUILB) comme la défragmentation (DEFRAG) ou encore si vous êtes en version Enterprise, le faire en ONLINE (prévoyez la place physique).

    Existe-t'il une possibilité, lorsque la défragmentation d'un index dure trop de temps, de l'avorter ? Où alors, existe-t'il des méthodes afin d'éviter ce genre d'inconvéniants ?
    Non, c'est une opération atomique ! Heureusement d'ailleurs. En revanche vous pouvez opter pour un script qui se limite dans une fenêtre de temps.

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    240
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2008
    Messages : 240
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    C'est pourquoi cette tâche doit être planifiée aux heures creuses et se limiter aux index réellement fragmentés. De plus vous pouvez utiliser des techniques moins agressive que la réindexation (REBUILB) comme la défragmentation (DEFRAG) ou encore si vous êtes en version Enterprise, le faire en ONLINE (prévoyez la place physique).
    Justement, c'est à 3h00 du matin, mais comme il s'agit d'un système d'information médicale, le système doit être disponnible 24h/24.

    Je vais essayer le DEFRAG et le ONLINE

    Quant au ScanDensity et l'ExtrentFrag, j'ai adapté le script afin de les comparer respectivement à <= 80 et et >= 20.

    Merci pour les informations

  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 994
    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 994
    Billets dans le blog
    6
    Par défaut
    Moi je descendrais encore à 70 et 30...

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    240
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2008
    Messages : 240
    Par défaut
    J'ai pu déterminer l'index sur lequelle cale la défragmentation.

    La défragmentation est effectuée par la commande suivante :

    SET @Sql = 'USE [' + @NomDataBase + '] DBCC DBREINDEX ([' + @NomTable + '],[' + @NomIndex + ']) WITH NO_INFOMSGS'
    EXECUTE (@SQL)

    J'ai été visualiser la vue système sys.dm_db_index_usage_stats. La valeur user_scans est bien trop élevée par rapport à la valeur user_seeks. Normalement, cet index sert a rechercher des valeurs déterminées, le user_seeks devrait alors être plus élevé que le user_scans. Il y a donc des requêtes anormale à trouver.

    Un lien intéressant : http://msdn.microsoft.com/msdnmag/is...lt.aspx?loc=fr

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    240
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2008
    Messages : 240
    Par défaut
    J'ai analysé une trace effectuée entre 3 et 3h30 du matin (la défragmentation était désactivée pour cette fois) en vue de détecter toutes les requêtes utilisant la table concernée.

    Je n'ai vu aucune instruction UPDATE sur cette table, mais la quantité d'instruction SELECT effectuée est ENORME.

    Est-ce que ce genre de situation peut provoquer une sorte de goulet d'étranglement, empêchant la défragmentation des index de la table ?

    J'ai remarqué aussi que certaines requêtes sont utilisées via un curseur (sp_cursor_open), (utilisation du AdUseServer en VB); est-ce pénalisant ?

    En tout cas, je n'ai pas réussi a isoler le ou les processus entrant en collision avec la défragmentation.

    Excepté exécuter la défragmentation sur cette table et faire un SELECT * FROM master..sysprocesses ORDER BY Blocked DESC afin de voir ce qu'il se passe, je ne vois pas très bien ce que je peux faire de plus.

Discussions similaires

  1. [2008R2] problème défragmentation d'indexes
    Par djilani83 dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 26/03/2014, 17h47
  2. problème auto remplacement des données dans une table
    Par rezguiinfo dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 26/02/2013, 21h32
  3. Réponses: 5
    Dernier message: 22/05/2012, 17h02
  4. Problème utilisation des index
    Par CCPMurat dans le forum Langage SQL
    Réponses: 8
    Dernier message: 27/06/2011, 11h32
  5. Problème au niveau des paramètres des index
    Par doudouSQL dans le forum Administration
    Réponses: 3
    Dernier message: 20/03/2011, 12h46

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