Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server
MS SQL-Server Forum Microsoft SQL-Server. Avant de poster -> FAQ SQL-Server, Tutoriels SQL-Server
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 02/08/2011, 14h12   #1
Invité de passage
 
Inscription : août 2008
Messages : 23
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 23
Points : 0
Points : 0
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.
vinse51 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/08/2011, 12h46   #2
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 954
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 954
Points : 17 774
Points : 17 774
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
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/08/2011, 12h59   #3
Responsable SQL Server

 
Avatar de mikedavem
 
Homme David BARBARIN
Expert SQL Server
Inscription : août 2005
Messages : 3 724
Détails du profil
Informations personnelles :
Nom : Homme David BARBARIN
Localisation : France, Haute Savoie (Rhône Alpes)

Informations professionnelles :
Activité : Expert SQL Server
Secteur : Conseil

Informations forums :
Inscription : août 2005
Messages : 3 724
Points : 6 845
Points : 6 845
Citation:
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.

++
mikedavem est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/08/2011, 14h50   #4
Invité de passage
 
Inscription : août 2008
Messages : 23
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 23
Points : 0
Points : 0
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.
vinse51 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/08/2011, 14h53   #5
Responsable SQL Server

 
Avatar de mikedavem
 
Homme David BARBARIN
Expert SQL Server
Inscription : août 2005
Messages : 3 724
Détails du profil
Informations personnelles :
Nom : Homme David BARBARIN
Localisation : France, Haute Savoie (Rhône Alpes)

Informations professionnelles :
Activité : Expert SQL Server
Secteur : Conseil

Informations forums :
Inscription : août 2005
Messages : 3 724
Points : 6 845
Points : 6 845
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 ?

++
mikedavem est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/08/2011, 15h19   #6
Invité de passage
 
Inscription : août 2008
Messages : 23
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 23
Points : 0
Points : 0
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 ?
vinse51 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/08/2011, 18h08   #7
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 954
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 954
Points : 17 774
Points : 17 774
Quelle est la version de la base et celle du serveur ?

A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/08/2011, 01h20   #8
Invité de passage
 
Inscription : août 2008
Messages : 23
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 23
Points : 0
Points : 0
Il s'agit de Sql Server 2008 r2 Web Edition qui tourne sur Windows Server 2008 R2 Core Web Edition 64bits sans aucun rôle installé.
La machine est entièrement dédié au processus SQL Server.

Par contre je ne sais pas si c'est important mais la BD a d'abord tournée sur 2005 Express puis 2008 r2 Express avant ce serveur.
vinse51 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/08/2011, 16h39   #9
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Architecte de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : novembre 2004
Messages : 1 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
Question bête:
après 'reconstruction' de vos indexes, avez vous vérifié qu'ils étaient toujours présent (et actif)?
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/08/2011, 17h01   #10
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Architecte de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : novembre 2004
Messages : 1 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
A propos la web edition ne gère que 4 processeurs....
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/08/2011, 17h13   #11
Invité de passage
 
Inscription : août 2008
Messages : 23
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 23
Points : 0
Points : 0
Non malheureusement je n'ai pas effectué cette vérification.
J'avoue que j'étais tellement choqué par le problème que je n'ai vraiment pas pris le temps d'investir en profondeur.

Plus je tourne autour et plus il me semble qu'effectivement après les reconstructions les index n'étaient tout simplement plus utilisés.

Je ne pense pas qu'ils aient pu être supprimés par SQL Server sans que je lui en donne l'instruction.

Par contre pour une raison inconnue il semble que l'optimiseur ai décidé que les indexs reconstruits n'étaient plus utilisables !
Je soupçonne que cela a à voir avec les statistique puisque c'est là dessus que se base l'optimiseur.

Mais comment une reconstruction d'index pourrait entrainer l'invalidation de ceux-ci ?

Edit : oui quand je dit 8 processeurs il s'agit de 2 processeurs physique de 4 cœurs chacun.
vinse51 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/08/2011, 05h11   #12
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 669
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Souquet
Âge : 30
Localisation : Thaïlande

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : janvier 2005
Messages : 4 669
Points : 8 729
Points : 8 729
Bonjour,

Citation:
Je ne pense pas qu'ils aient pu être supprimés par SQL Server sans que je lui en donne l'instruction.
C'est exact : seule l'instruction DROP INDEX unIndex ON uneTableOuUneVueIndexee supprime un index.
Est-ce que vous utilisez un plan de maintenance, ou bien une procédure stockée "maison" ?

Citation:
Envoyé par iberserk
après 'reconstruction' de vos indexes, avez vous vérifié qu'ils étaient toujours présent (et actif)?
Cela mérite un coup d’œil
Utilisez pour ce faire la première requête de mon billet en ajoutant I.is_disabled dans le SELECT

Citation:
Par contre pour une raison inconnue il semble que l'optimiseur ai décidé que les indexs reconstruits n'étaient plus utilisables !
Je soupçonne que cela a à voir avec les statistique puisque c'est là dessus que se base l'optimiseur.

Mais comment une reconstruction d'index pourrait entrainer l'invalidation de ceux-ci ?
Lors de la reconstruction d'un index, la statistique sous-jacente est ré-échantillonnée (jamais dans le cas d'une réorganisation) à 100% (équivalent FULLSCAN), et je me souviens avoir eu un problème avec cela, résolu par un échantillonnage par défaut (UPDATE STATISTICS monIndex (sans FULLSCAN)).

Je pense que c'est dû au fait que le nombre d'étapes des statistiques est trop faible (maximum 200) dans certains cas pour permettre à SQL Server d'évaluer à peu près correctement et dans tous les cas la cardinalité d'un prédicat ...
Mais encore une fois, c'était un cas isolé, ce qui ne semble pas être votre cas ...

Vous devez peut-être envisager de capturer le plan d'une requête avant que la reconstruction soit faite, puis après, et évaluer les différences ...

@++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes.
Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012
elsuket est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 10h18.


 
 
 
 
Partenaires

Hébergement Web