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

Langage SQL Discussion :

Utilisation des index (dans une clause WHERE)


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Inscrit en
    Avril 2002
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 187
    Points : 90
    Points
    90
    Par défaut Utilisation des index (dans une clause WHERE)
    Bonjour,

    Voici ma question :

    J'ai entendu dire que, dans une clause WHERE portant sur (disons) 6 champs indexés, un seul des 6 index était réellement utilisé par le SGBD. Donc, après avoir opéré une première sélection d'enregistrements sur base d'un des index (lequel ?), le moteur parcourerait ensuite séquentiellement ce résultat intermédiaire pour opérer sa sélection finale. Il n'utiliserait donc plus aucun autre index dans sa sélection finale.

    Est-ce exacte ? Ou bien cela dépend-t-il du sgbd ?

    La question sous jacente est la suivante : j'utilise un query avec une clause WHERE qui porte sur 6 champs et je constate que cela rame. Je sais que sur la moitié des champs de la clause WHERE il existe un index, pas sur les autres. Cela vaut-il la peine de créer les indexs manquant, ou est-ce inutile vu les doutes soulevés par ma première question ?

    Merci.

    JJE

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Tout-à-fait, une table n'utilisera au mieux qu'un seul index B*Tree.

    Il existe des index bitmap qui sont combinables, mais ils ne sont disponibles que sur peu de SGBD et ont des spécificités d'utilisation.

    Indexer vos colonnes une à une n'a de sens que si vous avez des accès à votre table par ces colonnes unitairement.

    Par contre, un index peut porter sur vos six colonnes, et le temps de réponse de votre requête sera à coup sûr grandement amélioré.

    Toutefois n'oubliez pas qu'un index n'est pas gratuit : il a un coût de construction, de maintenance, d'espace disque.
    Il faut mettre ces éléments aussi dans la balance.

  3. #3
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Bonjour,

    J'emetrai quand même une nuance sur ce que dit Waldar (ou alors j'ai mal compris ce que tu as dis).

    A partir d'index b*tree un sgbd peut très bien engendrer une comparaison de type bitmap.

    De ce fait en disposant de plusieurs index sur des colonnes uniques, le sgbd peut être amené à utiliser ces différents index et les recouper (par exemple sous postgesql ou db2 system i)

  4. #4
    Membre régulier
    Inscrit en
    Avril 2002
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 187
    Points : 90
    Points
    90
    Par défaut
    Citation Envoyé par punkoff Voir le message
    (par exemple sous postgesql ou db2 system i)
    Donc, cela pourrait quand même dépendre du SGBD...
    Nous travaillons sous Caché de chez Intersystems. Un truc bizarre dont je n'avais jamais entendu parler jusqu'à ce que j'arrive chez mon nouvel employeur.
    Je vais me renseigner plus avant chez mon DBA.

    Merci pour vos réponses.



    JJE

  5. #5
    Membre chevronné
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Points : 1 806
    Points
    1 806
    Par défaut
    Même si le SGBD peut se dépatouiller, ça va lui demander de faire des opérations assez coûteuses (a priori il ne le fera que s'il escompte un gain, mais bon).
    => Un index portant sur plusieurs champs sera nettement plus efficace, l'ordre étant important. Idéalement, il faut placer le champ le plus sélectif en premier, mais il faut aussi tenir compte de l'ensemble des requêtes formulées pour avoir un index le plus utilisable possible.

  6. #6
    Membre régulier
    Inscrit en
    Avril 2002
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 187
    Points : 90
    Points
    90
    Par défaut
    En fait, pour corser le tout, il faut savoir que la clause WHERE de mon query est construite dynamiquement en fonction de paramètres que l'utilisateur introduit à son écran. Et donc, l'application ne sait pas à l'avance de quoi sera constituée cette clause WHERE. Il se peut que celle-ci agisse sur un seul champs tout comme il est possible qu'elle agisse sur une combinaison allant de 2 à 6 champs. Tout est donc fonction des résultats souhaités par l'utilisateur.

    Donc, nouvelle question : ai-je intérêt à créer 6 indexes (un sur chaque champ) ou ai-je intérêt à construire un seul indexe qui inclut les 6 champs ? Dans cette dernière hypothèse, est-ce que l'ordre des champs dans cet indexe a de l'importance ?

    Merci.



    JJE

    PS : avez-vous remarquez que je m'étais documenté entre-temps sur la manière d'écrire le mot "indexe" ainsi que son pluriel. A force d'utiliser l'anglais en informatique, on y perd un peu son français .

  7. #7
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Index est invariable en français : un index, des index.
    Indexes est le pluriel anglais !

    Vous l'écriviez bien... au début !

  8. #8
    Membre régulier
    Inscrit en
    Avril 2002
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 187
    Points : 90
    Points
    90
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Index est invariable en français : un index, des index.
    Indexes est le pluriel anglais !

    Vous l'écriviez bien... au début !
    D'accord !

    Je croyais avoir retrouvé mon français, mais non, l'anglais me poursuit...

    Autant pour moi !



    JJE

  9. #9
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Salut !

    Sur Oracle aussi, on fait de l'index join sans bitmap, on a même un petit article sur le site :
    http://blog.developpez.com/pachot/p8...fp-index-join/

    Sinon pour le reste, la stratégie d'indexation dépend de plein de trucs dont le cas d'utilisation. L'intérêt d'avoir un index composite sur les 6 colonnes serait de le rendre couvrant et éventuellement d'économiser un accès table.
    Par contre, augmenter la taille de l'index, ça alourdit les "large scans"... du coup si tu récupères peu de lignes, tu peux vouloir juste trouver la combinaison "suffisamment sélective"...

    (c'est ma photo)
    Paku, Paku !
    Pour les jeunes incultes : non, je ne suis pas un pokémon...

    Le pacblog : http://pacmann.over-blog.com/

  10. #10
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 763
    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 763
    Points : 52 554
    Points
    52 554
    Billets dans le blog
    5
    Par défaut
    A lire : Que faut-il indexer ?

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

  11. #11
    Membre régulier
    Inscrit en
    Avril 2002
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 187
    Points : 90
    Points
    90
    Par défaut
    Ola,

    Merci pour toutes vos réponses et en particulier à celle de SQLPro : ce lien répond à toutes mes questions.



    JJE

  12. #12
    Membre régulier
    Inscrit en
    Avril 2002
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 187
    Points : 90
    Points
    90
    Par défaut
    Hi,

    Je réouvre le post pour une dernière question :

    L'ordre dans lequel sont énumérées les conditions dans la clause WHERE a-t-il de l'importance ? En d'autres temres, vaut-il mieux placer comme première condition celle qui dispose d'un index utilisable (ou qui est la plus sélective) ?

    Autre manière de formuler la question, les SGBD sont-ils suffisament intelligents que pour optimiser l'ordre des conditions à tester dans la clause WHERE ?

    Merci



    JJE

  13. #13
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Je ne saurais me prononcer pour Caché, mais les gros SGBD du marché ont des optimiseurs qui s'appuient sur des statistiques et choisissent en fonction de ces dernières la meilleure façon d'accéder aux données.

Discussions similaires

  1. Utilisation des alias dans la clause WHERE d'une requête SELECT
    Par OursRêveur dans le forum MS SQL Server
    Réponses: 14
    Dernier message: 13/07/2013, 04h34
  2. Ordre des conditions dans une clause WHERE, important ou pas en 2012 ?
    Par clavier12AZQSWX dans le forum Langage SQL
    Réponses: 5
    Dernier message: 07/03/2012, 11h54
  3. Utilisation des index dans une requête
    Par sanouphil dans le forum Débuter
    Réponses: 60
    Dernier message: 10/11/2010, 16h25
  4. insensibilité des accents dans une clause where (Critéria)
    Par Frederic.Salembier dans le forum Hibernate
    Réponses: 6
    Dernier message: 24/05/2009, 14h06
  5. [SQL2K][TSQL] Peut-on utiliser un alias dans une clause Where ?
    Par StormimOn dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 23/05/2006, 09h25

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