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 :

question sur les index


Sujet :

MS SQL Server

  1. #1
    Membre à l'essai
    Inscrit en
    Janvier 2005
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 20
    Points : 12
    Points
    12
    Par défaut question sur les index
    bonjour
    j'ai une petite question sur les index dans ms sql server 2000.
    voilà j'ai une requête du type

    select * from table where col1 = @col1 and col2 = @col2
    cette requête ne me retourne que quelques enregistrements

    est ce que quelqu'un peut me confirme que pour tuner cette requête
    il me suffit de créer un index contenant ces deux enregistrements

    de plus, j'ai environ 100.000 enregistrements à ajouter en une fois avec environ 8 index
    j'aimerai un retour niveau performance entre deux solutions :
    - insertion simple
    - désactivation des index, insertion des enregistrments, réactivation des index avec rebuild

    merci d'avance
    Philippe

  2. #2
    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,

    Tu peux en effet créer un index sur les deux colonnes, en choisissant en premier la colonne la plus sélective = celle qui contient le moins de doublons. Ensuite, en exécutant la requête en affichant le plan d'exécution, assure-toi que l'index est bien utilisé. Fais aussi la comparaison des pages lues en exécutant ta requête avant et après index après un SET STATISTICS IO ON.

    Pour le deuxième sujet, dans ton cas, une suppression et recréation d'index après l'insert sera probablement plus efficace. Assure-toi de créer l'index ordonné avant les autres.
    Rudi Bruchez
    Rudi Bruchez EIRL, solutions MS SQL Server et NoSQL
    LinkedIn - [Outil libre de diagnostic SQL Server : Sql Trismegiste]
    LIVRES : Optimiser SQL Server -
    Microsoft SQL Server 2012 Security Cookbook
    - les bases de données NoSQL

    e-learning : LinkedIn Learning - Pluralsight

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    434
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 434
    Points : 502
    Points
    502
    Par défaut
    Citation Envoyé par rudib
    assure-toi que l'index est bien utilisé.
    Salut,

    ca fait un paye que je fais du SQL et c'est vrai que je ne me suis jamais posé la question de savoir si un index est utilisé ou pas (sur pas DBA ).
    Si tu positionnes un index sur une colonne, et que cette colonne fait partie d'une clause WHERE ou d'un jointure, l'index n'est pas forcément utilisé ?

    Si c'est le cas, qu'est-ce qui détermine l'utilisation ou pas d'un index ?

  4. #4
    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
    Salut,

    Eh bien non, l'index n'est pas forcément utilisé. SQL Server maintient des statistiques de distribution des données dans l'index (DBCC SHOW_STATISTICS ( table , index )). Il sait donc à peu près quel est sa sélectivité (le nombre de valeurs différentes dans l'index).
    Si l'index est peu sélectif (= beaucoup de doublons), SQL server peut choisir de ne pas l'utiliser, parce que le coût de parcours de l'index pour chaque enregistrement à retourner est estimé plus élevé qu'un scan de la table.

    Si dans l'exemple de sohm:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from table where col1 = @col1 and col2 = @col2
    il y a un index non ordonné (col1, col2), et col1 est un bit qui comporte 50% de 1 et 50% de 0, ou simplement un int qui contient la valeur 10 sur peut-être 20% ou 30% des enregistrements, SQL Server peut très bien décider de se passer de l'index. Il aura raison, ce serait plus coûteux de l'utiliser.

    Potentiellement, il pourrait aussi décider de ne pas utiliser l'index s'il sait qu'il doit retourner beaucoup d'enregistrements, et que, comme on le voit ici, il y a un SELECT * ou un SELECT de colonnes qui ne sont pas dans l'index, parce que le coût des bookmarks lookups ou des parcours de l'index ordonné sera estimé plus important que le scan. Mais c'est probablement plus rare.

    Dans ces cas, inutile de créer un index qui ralentira les opérations DML (insert, update).

    Il y a sans doute d'autres cas, par exemple s'il y a deux index, un sur col1 et l'autre sur col2, l'optimiseur pourrait choisir de n'en utiliser qu'un. C'est toujours une bonne idée de s'assurer que l'index est utilisé.
    Rudi Bruchez
    Rudi Bruchez EIRL, solutions MS SQL Server et NoSQL
    LinkedIn - [Outil libre de diagnostic SQL Server : Sql Trismegiste]
    LIVRES : Optimiser SQL Server -
    Microsoft SQL Server 2012 Security Cookbook
    - les bases de données NoSQL

    e-learning : LinkedIn Learning - Pluralsight

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    434
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 434
    Points : 502
    Points
    502
    Par défaut
    très clair merci

    D'une manière générale, je positionne des index sur les clefs fonctionnelles (qui ne sont pas forcément des clefs primaires). Si la clef fonctionnelle est bien designée, peu de doublons, donc utilisation quasi-sure d'un index.

    Cdlt

  6. #6
    Rédacteur
    Avatar de WOLO Laurent
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Mars 2003
    Messages
    2 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Congo-Brazzaville

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 741
    Points : 4 414
    Points
    4 414
    Par défaut
    Non, détrompe toi !

    Il ne suffit pas de créer un index puis d'inclure la colonne concernée par l'index dans la clause where pour qu'il l'optimiseur puisse l'inclure.
    L'optimiseur choisit généralement le plan d'execution le plus éfficace.
    Dans le cas par exemple ou vous avez crée plusieurs index pour la même colonne, l'optimiseur choisit l'index pouvant fournir le plus de performance.

    Mais prénez garde, c'est un programme comme tout autre.
    Il y a tout un tap de trucs et astuces à prendre en compte pour la création.
    mais votre grand indicateur est le plan d'execution, vous devez être en mésure de l'analyser.

    Découvrez la FAQ de MS SQL Server.
    La chance accorde ses faveurs aux esprits avertis !

  7. #7
    Membre averti
    Inscrit en
    Octobre 2005
    Messages
    344
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 344
    Points : 324
    Points
    324
    Par défaut
    Est-il possible sous SQL Server de forcer l'utilisation d'un index, même si l'optimiseur ne l'aurait pas forcément pris ... Un peu comme les HINTS sous ORACLE ?

  8. #8
    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
    OULAH !

    Oui, c'est possible, et non, il ne faut jamais le faire.

    Cela équivaut à jeter des peaux de banane devant toi dans un couloir obscur.

    Tu peux indiquer le nom de l'index à utiliser dans un hint, comme ça, ça te permet de tout faire tomber le jour où tu changes le nom de l'index, et d'obtenir des performances dix fois pire le jour où l'état des données ou de la structure font que l'utilisation de cet index n'est plus la meilleure solution.

    L'optimiseur de SQL Server est un moteur très performant, tu peux lui faire confiance.
    Rudi Bruchez
    Rudi Bruchez EIRL, solutions MS SQL Server et NoSQL
    LinkedIn - [Outil libre de diagnostic SQL Server : Sql Trismegiste]
    LIVRES : Optimiser SQL Server -
    Microsoft SQL Server 2012 Security Cookbook
    - les bases de données NoSQL

    e-learning : LinkedIn Learning - Pluralsight

  9. #9
    Rédacteur
    Avatar de WOLO Laurent
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Mars 2003
    Messages
    2 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Congo-Brazzaville

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 741
    Points : 4 414
    Points
    4 414
    Par défaut
    Citation Envoyé par rudib
    OULAH !
    L'optimiseur de SQL Server est un moteur très performant, tu peux lui faire confiance.
    L'optimiseur de SQL Serveur est très très futé, c'est le plus rapide à l'heure actuelle, pas besoin de souffrire avec les hints, c'est pas recommandé comme l'a dit rudib !

    Découvrez la FAQ de MS SQL Server.
    La chance accorde ses faveurs aux esprits avertis !

  10. #10
    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
    Une info supplémentaire : en SQL 2005, il y a une vue système qui permet de déterminer si un index a été utilisé : Sys.dm_db_index_usage_stats

    Des exemples d'utilisation ici :
    http://blogs.msdn.com/sqlcat/archive...12/502735.aspx
    Rudi Bruchez
    Rudi Bruchez EIRL, solutions MS SQL Server et NoSQL
    LinkedIn - [Outil libre de diagnostic SQL Server : Sql Trismegiste]
    LIVRES : Optimiser SQL Server -
    Microsoft SQL Server 2012 Security Cookbook
    - les bases de données NoSQL

    e-learning : LinkedIn Learning - Pluralsight

Discussions similaires

  1. Question sur les index mysql
    Par Cyrius dans le forum Requêtes
    Réponses: 4
    Dernier message: 08/08/2006, 22h25
  2. Question sur les index
    Par Veve44 dans le forum Oracle
    Réponses: 3
    Dernier message: 09/11/2005, 14h01
  3. Question sur les index
    Par barok dans le forum Décisions SGBD
    Réponses: 4
    Dernier message: 31/05/2005, 08h06
  4. [DB2] Question sur les index et les vues
    Par ahoyeau dans le forum DB2
    Réponses: 1
    Dernier message: 14/03/2005, 08h30
  5. Questions sur les indexations
    Par freud dans le forum Bases de données
    Réponses: 2
    Dernier message: 11/05/2004, 11h38

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