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 :

Une bonne gestion des index


Sujet :

Administration SQL Server

  1. #1
    Nouveau membre du Club
    Inscrit en
    Mai 2012
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Mai 2012
    Messages : 51
    Points : 27
    Points
    27
    Par défaut Une bonne gestion des index
    Bonjour à tous,

    Je travaille en ce moment sur un projet avec une Base SQL Server qui vient d’être upgrade de 2008 à 2012 et malheureusement, nous d'avons pas de DBA dans l'équipe...

    On a pas mal de problème de performance sur notre base alors que la machine en elle même est surdimensionné d'après notre architecte.

    Je suis en train de suivre la piste des index :
    Pour le moment, on a 45Go de données sur notre base + 100 Go d'index. Ce qui me parait carrément aberrant.

    Je me demandais s'il y avait des habitudes à prendre au niveau des index afin d'améliorer les perfs sans pour autant avoir 2 fois plus d'index que de données...
    On a récemment passé un script pour réorganiser les index avec une fragmentation entre 6% et 30%, et on a reconstruit ceux >30%.
    On a créé tous les index manquants avec comme condition :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CAST((ddmigs.user_seeks + ddmigs.user_scans) * ddmigs.avg_user_impact AS INT) > 100
    avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sys.dm_db_missing_index_group_stats AS ddmigs
    Ce sont des scripts qu'on a plus ou moins récupérer sur le net, mais bon, pourquoi 6% ? pourquoi 30 % ? Pourquoi >100 ? Je ne sais pas trop, j'espérais justement que vous puissiez m'aider la dessus.


    Auriez-vous des recommandations à ces sujets ?
    - Comment faire pour supprimer les index inutiles ? La table "dm_db_missing_index_group_stats" donne de bonne infos, mais à partir de quand est-ce qu'un index est réellement à considérer comme inutile ? Et comment savoir la taille en Mo que prennent ces index ?
    J'envisageais de partir sur une suppression des index avec comme condition :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE (IUS.user_seeks + IUS.user_scans + IUS.user_lookups) <= 1
    avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dm_db_index_usage_stats AS IUS
    Par contre, je n'arrive pas à savoir à l'avance l'espace disque que cela me fera gagner.

    - Faut-il reconstruire les index régulièrement, genre toutes les nuits ? Si oui quels paliers faut-il utiliser ?

    - D'autres choses indispensables à savoir ?

    Merci d'avance pour votre aide

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 134
    Points : 38 557
    Points
    38 557
    Billets dans le blog
    9
    Par défaut
    Bonjour

    Selon la façon dont le DDL a été généré, il est fort possible que tous les index par défaut aient été construits, auquel cas vous en avez une flopée qui ne servent à rien, commencez par analyser et détruire ceux là.
    Vous pouvez vous appuyer sur le nombre de valeurs de clefs distinctes pour avoir une présomption d'utilité/inutilité
    Exemple : si vous avez un index sur le code sexe de votre tables individus, cet index est inutile car il ne prendra au plus que 2 ou 3 valeurs
    Pistez aussi les index redondants, exemple I1=C1 asc+C2 asc+C3 asc et I2=C1 asc+C2 asc
    Les index les plus couteux sont bien sur les index multiples et ce d'autant plus qu'ils sont multi-colonnes, à chasser en premier donc

    Attention lors de vos analyses :
    - le SQL dynamique échappe aux études d'impact, certains index sont peut être utilisés par ce type de requêtes, difficile d'analyser ces cas
    - certains index sont peut être très utiles pour des traitements de masse à périodicité longue (genre clôture annuelle, purge etc...), il faut donc être prudent si l'on analyse à partir de la date d'utilisation de l'index. Tout index non utilisé récemment n'est pas forcément inutile

  3. #3
    Nouveau membre du Club
    Inscrit en
    Mai 2012
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Mai 2012
    Messages : 51
    Points : 27
    Points
    27
    Par défaut
    Merci pour ta réponse,

    Le soucis, c'est qu'on a en fait hérité d'un projet qui avait été développé pour de multiples clients et que nous, on ne s'en sert que pour un.
    De ce fait, il y a énormément de tables inutiles/vides et des tables utiles mais avec des colonnes inutiles/vides, et nous ne sommes pas capable pour le moment de faire le tri de manière simple. C'est un travail qu'on a en fils rouge, on y va petit à petit.

    Par exemple, on a des requêtes de partout qui font des LEFT JOIN sur des tables inutiles dans notre cas, on ne peut donc pas simplement faire le vide.

    On arrive donc à une base de 1500 tables et faire le tri des index un par un me parait inimaginable.
    C'est pourquoi j'étais plutôt à la recherche de stats sur ces index. Après, c'est vrai qu'on ne peut pas se fier à 100% sur ces stats, mais ça me parait être une bonne base de départ pour faire le tri.
    On maîtrise globalement tous les JOBs et le côté fonctionnel de l'appli, donc on pourra être à même de cibler les traitement à faible fréquence.

  4. #4
    Membre expérimenté

    Homme Profil pro
    Auditeur informatique
    Inscrit en
    Novembre 2014
    Messages
    815
    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 : 815
    Points : 1 350
    Points
    1 350
    Billets dans le blog
    2
    Par défaut
    merci de penser a faire une mis a jour de vos statistics

    vu que vous avez fait un upgrade du version vers 2012 il se peut que vos statistics sont obsolète

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 766
    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 766
    Points : 52 561
    Points
    52 561
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par Tiffado Voir le message
    Bonjour à tous,

    Je travaille en ce moment sur un projet avec une Base SQL Server qui vient d’être upgrade de 2008 à 2012 et malheureusement, nous d'avons pas de DBA dans l'équipe...

    On a pas mal de problème de performance sur notre base alors que la machine en elle même est surdimensionné d'après notre architecte.

    Je suis en train de suivre la piste des index :
    Pour le moment, on a 45Go de données sur notre base + 100 Go d'index. Ce qui me parait carrément aberrant.
    Effectivement anormal mais probablement lié à des tables obèses.
    A vérifier : http://blog.developpez.com/sqlpro/p1...mances_petites

    Je me demandais s'il y avait des habitudes à prendre au niveau des index afin d'améliorer les perfs sans pour autant avoir 2 fois plus d'index que de données...
    On a récemment passé un script pour réorganiser les index avec une fragmentation entre 6% et 30%, et on a reconstruit ceux >30%.
    On a créé tous les index manquants avec comme condition :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CAST((ddmigs.user_seeks + ddmigs.user_scans) * ddmigs.avg_user_impact AS INT) > 100
    avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sys.dm_db_missing_index_group_stats AS ddmigs
    Pas bon. Il faut mutualiser la demanjde d'index, car même avec cela vous aller créer des index inclus et quasi redondants !
    Traquez les avec : http://blog.developpez.com/sqlpro/p9...s_index_anorma

    Ce sont des scripts qu'on a plus ou moins récupérer sur le net, mais bon, pourquoi 6% ? pourquoi 30 % ? Pourquoi >100 ? Je ne sais pas trop, j'espérais justement que vous puissiez m'aider la dessus.
    30 % pour reconstruire, 10 % pour défragmenter à condition que l'index fasse au moins 96 pages. En effet les pages sont regroupées par blocs de 8 appelées extensions. Si vous avez 8 blos de 8 pages qet que l'un des blocs n'est utilisé que pour une page, cela fait : 8*8 = 64 pages por une utilisation de 7*8 + 1 = 57. Bref une fragmentation irréfragable de (64-57)/64, soit 11% !
    Pour plus d'info, voir notre livre sur SQL Server 2014...


    Auriez-vous des recommandations à ces sujets ?
    - Comment faire pour supprimer les index inutiles ? La table "dm_db_missing_index_group_stats" donne de bonne infos, mais à partir de quand est-ce qu'un index est réellement à considérer comme inutile ? Et comment savoir la taille en Mo que prennent ces index ?
    J'envisageais de partir sur une suppression des index avec comme condition :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE (IUS.user_seeks + IUS.user_scans + IUS.user_lookups) <= 1
    avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dm_db_index_usage_stats AS IUS
    ATTENTION : ces métriques (DMV) sont en mémoire et RAZ à chaque démarrage. Il faut au moins 32 jours de rémanence sinon vous risquez de supprimez des index cruciaux qui ne sont utilisé que mensuellement.... Pour voir depuis quand le serveur à démarré :
    SELECT sqlserver_start_time FROM sys.dm_os_sys_info


    Par contre, je n'arrive pas à savoir à l'avance l'espace disque que cela me fera gagner.

    - Faut-il reconstruire les index régulièrement, genre toutes les nuits ? Si oui quels paliers faut-il utiliser ?
    OUI ! 30, 10, 96 !

    - D'autres choses indispensables à savoir ?
    Recalculer les statistiques qui le nécessite en FULL SCAN.

    Merci d'avance pour votre aide
    A +

    Nom : Couverture livre SQL server Eyrolles.jpg
Affichages : 282
Taille : 105,0 Ko
    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/ * * * * *

  6. #6
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 134
    Points : 38 557
    Points
    38 557
    Billets dans le blog
    9
    Par défaut
    Pour en revenir au post initial ,
    Citation Envoyé par Tiffado Voir le message
    malheureusement, nous d'avons pas de DBA dans l'équipe...
    Ne pouvez vous pas demander à minima une prestation externe, ne serait-ce que de quelques jours, pour faire une analyse rigoureuse
    ou mieux, l'ouverture d'un poste de DBA

    Citation Envoyé par Tiffado Voir le message
    On a pas mal de problème de performance sur notre base alors que la machine en elle même est surdimensionné d'après notre architecte.
    Je suis en train de suivre la piste des index
    il faut bien commencer par quelque chose, mais d'autres pistes pouront être explorées : parallélisme des traitements, partitionnement, taille des verrous et niveaux de verrouillage, tables obèses, présence de colonnes varchar/longvarchar inutiles, longueur des identifiants, qualité des requêtes (prédicats sargables, tris inutiles, colonnes inutiles notamment select *....), purge des données obsolètes, réorg, runstat/rebind, etc...

  7. #7
    Nouveau membre du Club
    Inscrit en
    Mai 2012
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Mai 2012
    Messages : 51
    Points : 27
    Points
    27
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    ...
    Merci pour toutes ces réponses, je connaissais certains des risques mais ca ne coute rien de se les faire rappeler.

    Et effectivement, on a une table avec 4Go de données pour 30Go d'index à elle seule. Les missing index ont été créé en lot, ce qui fait qu'ils sont pour la plupart redondants. On va fouiller a ce niveau la et faire un peu de tri.

    Citation Envoyé par escartefigue Voir le message
    ...
    On a eu quelques difficultés pour en trouver, on a eu des DBA Oracle de passage, mais bon, du coup le SQL Server n'était pas trop sa spécialité.
    Nous en sommes en cours de rechercher pour trouver un intervenant qui ne devrait pas trop tarder à faire un diagnostique.

  8. #8
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 766
    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 766
    Points : 52 561
    Points
    52 561
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par Tiffado Voir le message
    Merci pour toutes ces réponses, je connaissais certains des risques mais ca ne coute rien de se les faire rappeler.

    Et effectivement, on a une table avec 4Go de données pour 30Go d'index à elle seule. Les missing index ont été créé en lot, ce qui fait qu'ils sont pour la plupart redondants. On va fouiller a ce niveau la et faire un peu de tri.


    On a eu quelques difficultés pour en trouver, on a eu des DBA Oracle de passage, mais bon, du coup le SQL Server n'était pas trop sa spécialité.
    Nous en sommes en cours de rechercher pour trouver un intervenant qui ne devrait pas trop tarder à faire un diagnostique.
    Avant de passer par l'étape intervenant lisez les 5 documents d'optimisation que j'ai posté au sujet de mon expérience passée en audit et conseil dans différentes entreprise clientes :
    http://www.sqlspot.com/Voulez-vous-optimiser-votre.html

    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/ * * * * *

Discussions similaires

  1. Réponses: 0
    Dernier message: 10/09/2009, 17h48
  2. Quel SGBD a une bonne gestion des LOGs ?
    Par joker vb dans le forum Décisions SGBD
    Réponses: 12
    Dernier message: 03/04/2008, 17h17
  3. [Oracle 9i] gestion des indexs
    Par Herveg dans le forum Oracle
    Réponses: 14
    Dernier message: 18/05/2006, 12h00
  4. Gestion des indexes
    Par tomca dans le forum Oracle
    Réponses: 6
    Dernier message: 17/02/2006, 10h27
  5. [VB.NET]La bonne gestion des forms
    Par Wintermute dans le forum Windows Forms
    Réponses: 11
    Dernier message: 13/01/2004, 16h35

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