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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Avril 2002
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 187
    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
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    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 : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    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 confirmé
    Inscrit en
    Avril 2002
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 187
    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 Expert
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    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 confirmé
    Inscrit en
    Avril 2002
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 187
    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 .

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