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 :

Reconstructions d'index qui dégradent les performances


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2008
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 27
    Par défaut Reconstructions d'index qui dégradent les performances
    Bonjour à tous,

    J'ai récemment acquis un nouveau serveur très performant pour accueillir ma base de données. Il s'agit d'un SQL Server 2008 r2 Web Edition, avec 8 processeurs, 24 Go de ram et 120 Go en SSD.
    Depuis les migrations, les performances des requêtes ont été améliorées par 10 et je suis très satisfait du serveur.

    Cependant, quelques jours après la migration j'ai procédé à la reconstruction des différents indexs (non cluster) comme je le faisais environ 1 fois par semaine sur l'ancien serveur. Cela concerne une centaine d'index (la bd compte 300 tables et pèse 40 Go au total).

    Mais voila, environ 1 heure après les rebuild, je me suis aperçu que le processeur était bloqué à 100% alors qu'en temps normal il ne dépasse absolument jamais les 20% de moyenne.
    Plusieurs requêtes un peu gourmandes donnait des timeout alors qu'en temps normal elles prennent 5s max.

    J'ai tenté de relancer le moteur, puis la machine mais rien à faire la base de données était complètement inutilisable, détruite !
    J'ai du me contraindre à restaurer une sauvegarde complète effectuée quelques heures avant les rebuild et tout est revenu à la normale.

    Mais je voudrais vraiment comprendre ce problème car maintenant je n'ose plus du tout effectuer la moindre reconstruction d'index !

    Les seules différences avec l'ancien serveur sont :
    - disque dur en SSD
    - 24 Go de ram au lieu de 1 Go (limitation de la version Express disparue avec la version Web)

    J'ai lu qu'avec les disque SSD il ne fallait plus faire de défragmentation puisqu'il n'y a plus de têtes de lecture et il me semble que la reconstruction d'index est similaire à une défragmentation, mais est-ce que cela pourrait dégrader les performances à ce point ?

    Sinon peut être que le fait que la BD utilise désormais plus de 20 Go en ram a à voir quelque chose. Si toutes les reconstructions se font dans la ram alors peut être que tous les plans d’exécutions ne sont plus valides car l'ordre des données a changé ? Mais alors pourquoi en redémarrant le serveur cela ne résoudrait pas le problème ?

    Bref je n'ai franchement aucune explication à ce phénomène mais je serai vraiment très curieux d'en comprendre les causes.

    Merci d'avance pour vos éclairages.

  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
    22 002
    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 : 22 002
    Billets dans le blog
    6
    Par défaut
    Ceci est parfaitement normal. deux choses à dire :
    1) SQL Server est optimisé pour tirer partit du maximum de ressources
    2) pendant le reconstruction d'un index la table ne peut pas être utilisée.

    1) signifie que TOUS vos processeurs seront utilisés pour reconstruire un index, laissant peu de CPU pour les autres demandes. Utilisez l'option MAXDOP dans le CREATE / REBUILD INDEX pour limiter le nombre de CPU utilisé...

    2) il ne faut pas recréer un index aux heures pleines, mais :
    - soit le faire aux heures creuses
    - soit le faire avec l'option "ONLINE" (disponible uniquement en version Enterpise).

    En sus : en 64 bits, vous devez impérativement limiter la RAM utilisée par SQL Server à TOTAL RAM - 2 Go. Sinon SQL pompera la RAM de Windows et vous arriverez à l'instabilité que vous avez décrit (de toute façon les choses seraient rentrées dans l'ordre au final).

    Bref, un petit cours d'admin SQL Server ne serait sans doute pas superflu !

    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
    Expert confirmé
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Par défaut
    J'ai lu qu'avec les disque SSD il ne fallait plus faire de défragmentation puisqu'il n'y a plus de têtes de lecture et il me semble que la reconstruction d'index est similaire à une défragmentation, mais est-ce que cela pourrait dégrader les performances à ce point ?
    Je rajouterai que ceci est parfaitement faux. La fragmentation des index même sur des disques SSD est néfaste aux performances de vos requêtes pour plusieurs raisons :

    - Il faudrait lire ramener beaucoup plus de pages (ou blocs de pages .. extents) pour lire un même volume de données

    - Le choix de l'optimiseur peut changer si un index trop fragmenté est présent.

    Il ne faut pas confondre fragmentation logique (dans votre cas) et la fragmentation physique sur disque.

    ++

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Août 2008
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 27
    Par défaut
    Bonjour et merci pour vos réponses !

    Par contre je crois que je n'ai pas été bien compris.
    Le problème ne s'est pas posé pendant la reconstructions des index mais plusieurs dizaines de minutes plus tard.

    Je connais assez bien le fonctionnement des index et je sais qu'il ne faut pas les reconstruire n'importe quand car cela bloque l'accès aux tables.
    C'est pourquoi j'ai effectué les rebuild très tôt le matin et tout s'est bien passé.
    L'opération a pris quelques minutes et le serveur n'a pas bronché.

    C'est seulement plus tard que les performances ce sont dégradées, bien après la fin des requêtes de rebuild.

    Du coup est-ce que vos indications tiennent toujours où il s'agit d'autre chose ?

    PS: merci pour la remarque sur le total de ram à utiliser je n'y avais pas pensé mais c'est vrai ça parait logique qu'il faut en réserver pour le système je vais modifier la config même si je ne pense pas encore avoir eu de problème à ce niveau là.

    PS2: merci pour la confirmation sur la fragmentation, je me disais aussi que peu importe la fragmentation physique, la fragmentation des pages reste toujours un problème important et donc la reconstruction d'index nécessaire.

  5. #5
    Expert confirmé
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Par défaut
    Il faudrait mettre des sondes (via perfmon ou DMV) dans ce cas pour savoir ce qui prend autant de temps CPU après rebuild.

    Est ce que c'est le processus SQL Server ?
    Est ce que l'antivirus n'est pas en cause ?
    Est ce le temps CPU utilisateur ou privilégié qui est en cause ?
    Est ce une requête en particulier ?

    ++

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Août 2008
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 27
    Par défaut
    Le problème c'est que ça ne va pas être évident à reproduire malheureusement.

    Ce que je peux dire du peu que j'ai pris le temps d'analyser :
    - Oui c'est bien uniquement le processus SQL serveur bloqué continuellement à 100%
    - Il n'y a pas d'antivirus ni aucun logiciel d'analyse (le serveur est uniquement dédié à SQL serveur et j'utilise IPfilter pour n'autorisuer que l'IP du serveur Web et la mienne.
    - Ce n'est pas une requête en particulier mais toutes les "grosses requêtes", c'est à dire celles qui en temps normal lisent de quelques centaines à quelques milliers de pages (mais sur ce serveur c'est tout de même instantané)
    - Par contre d'autres requêtes passent encore comme de simple select sur clé primaire
    - même en attendant plusieurs dizaines de minutes rien ne s'arrange, la BD est complètement détruite et inutilisable sans restauration antérieure
    - Et dernière observation surement la plus importante : je suis presque sûr que le nombre de pages lues par requêtes a littéralement explosé : par exemple une requête qui en temps normal lit 400 pages en lisait peut être 150000 (le tout en 5min au lieu de 1s)

    Tout ceci me fait penser à un problème de statistiques qui ne seraient plus à jour ou bien aux plans d’exécutions qui deviennent fous, mais alors pourquoi en redémarrant le serveur (et même la machine) cela ne rentrerait pas dans l'ordre ?

Discussions similaires

  1. Index pour améliorer les performances
    Par Ceubex dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 21/09/2014, 22h08
  2. [2005] DISTINCT qui améliore les performances
    Par Sergejack dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 12/06/2011, 17h42
  3. [optimisation] Reconstruction d'index et performances
    Par jenesuispasunrobot dans le forum Oracle
    Réponses: 6
    Dernier message: 03/02/2011, 14h31
  4. Réponses: 13
    Dernier message: 07/05/2010, 17h49
  5. Quel est l'index qui sert pour les For Each ?
    Par Nixar dans le forum VB.NET
    Réponses: 5
    Dernier message: 04/06/2007, 08h23

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