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

 Oracle Discussion :

mon index n'est pas utilisé


Sujet :

Oracle

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2006
    Messages : 43
    Points : 39
    Points
    39
    Par défaut mon index n'est pas utilisé
    Bonjour,

    je dois créer une application web qui permet de récupérer des enregistrements dans une table.

    Cette base possède 4,2 millions d'enregistrements et une trentaine de champs.

    Les critères de recherches sont exclusivement de type radio bouton et checkbox.

    De plus, chaque fois qu'un critère est choisi (ou modifié), un comptage automatique du nombre d'enregistrement est mis à jour.

    Le but pour l'instant avant d'avancer dans le projet est de trouver le moyen le plus rapide pour arriver à récupérer le nombre d'enregistrement.

    Pour l'instant, la solution qu'on est en train de tester consiste à créer un champs 'filtre' dans la base qui est une chaine de caractère qui sera une sorte de filtre. Par exemple, comme critère, on a :
    - email : oui (1) ou non (0);
    - téléphone : oui (1) ou non (0);
    - age : de 0 à 9 ans (0) , de 10 à 19 ans (1), de 20 à 29 ans (2), etc

    donc, si un enregistrement possède un email, pas de téléphone et l'age est de 15, la valeur du filtre est : 101

    Un index sur filtre a été créé.

    Donc, par exemple pour trouver le nombre d'enregistrements qui ont un email et dont l'age est de 21 ans, on utilise la requête suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT count(*) FROM ma_table WHERE regexp_LIKE(filtre,'^1(0|1){1}2$')
    Le problème, c'est que le l'index sur filtre n'est pas utilisé et la requête met 163 secondes pour retourner un résultat.

    Je viens vous demander de l'aide pour savoir comment on peut utiliser l'index sur filtre.

    Sinon, peut être que quelqu'un aura une autre méthode.

    Merci d'avance

    Petite précision :
    J'utilise Oracle 10.2.0.3

  2. #2
    Membre actif Avatar de Ahmed AANGOUR
    Homme Profil pro
    DBA Oracle
    Inscrit en
    Janvier 2010
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : DBA Oracle

    Informations forums :
    Inscription : Janvier 2010
    Messages : 139
    Points : 271
    Points
    271
    Par défaut
    Bonjour,

    lorsqu'on a comme ça des filtres sur plusieurs champs et qui se combinent il vaut mieux utiliser des indexes BITMAP sur chaque champ. Oracle arrive bien à combiner ce type d'index et en plus ces indexes sont adéquates lorsque les colonnes ne sont pas très sélectives (c'est ton cas ici).

    Par contre ces indexes sont à éviter si t'as bcp d'accès concurrents en DML sur cette table.

    PS: les indexes bitmaps ne sont disponibles qu'avec l'enterprise edition

    cdmt,
    Ahmed

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2006
    Messages : 43
    Points : 39
    Points
    39
    Par défaut
    Bonjour,

    Merci de ta réponse.

    Cela marche très bien pour les champs avec peu de choix possible :
    - 4 champs avec 1 ou 0;
    - 2 champs avec des valeurs allant de 0 à 8.

    Par contre, la table possède deux champs qui ont respectivement 99 et 1442 valeurs possibles. Je les ai mis en index bitmap, mais cette méthode est moins efficace.

    Existe t il une méthode pour pouvoir indexer les deux autres champs de manière plus efficace que les index bitmap?

  4. #4
    Membre actif Avatar de Ahmed AANGOUR
    Homme Profil pro
    DBA Oracle
    Inscrit en
    Janvier 2010
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : DBA Oracle

    Informations forums :
    Inscription : Janvier 2010
    Messages : 139
    Points : 271
    Points
    271
    Par défaut
    Par contre, la table possède deux champs qui ont respectivement 99 et 1442 valeurs possibles. Je les ai mis en index bitmap, mais cette méthode est moins efficace.
    99 et 1442 valeurs possible sur combien de lignes?

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2006
    Messages : 43
    Points : 39
    Points
    39
    Par défaut
    chaque champs pour les 99 et 1442 est : 4 158 423

  6. #6
    Membre actif Avatar de Ahmed AANGOUR
    Homme Profil pro
    DBA Oracle
    Inscrit en
    Janvier 2010
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : DBA Oracle

    Informations forums :
    Inscription : Janvier 2010
    Messages : 139
    Points : 271
    Points
    271
    Par défaut
    l'index bitmap devrait faire l'affaire car la selectivité des colonnes est faible mais surtout ce qui importe c'est la combinaison des indexes bitmap qui est performante.

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2006
    Messages : 43
    Points : 39
    Points
    39
    Par défaut
    Merci de ton aide,

    En fait, je trouvais que c'était assez lent, mais c'est de ma faute.

    Dans la requête, dans le WHERE, j'avais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    WHERE 
    .....
    CRIT7(12,37,96,34,76,89,31,01,48)
    .....

    j'avais mis un index bitmap sur CRIT7 mais c'est un varchar2
    Et mon index n'était pas utilisé.


    Du coup en mettant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    WHERE 
    .....
    CRIT7('12','37','96','34','76','89','31','01','48')
    .....

    L'index est utilisé, et du coup, c'est plus rapide.

  8. #8
    Membre actif Avatar de Ahmed AANGOUR
    Homme Profil pro
    DBA Oracle
    Inscrit en
    Janvier 2010
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : DBA Oracle

    Informations forums :
    Inscription : Janvier 2010
    Messages : 139
    Points : 271
    Points
    271
    Par défaut
    ok c'est cool.
    N'oublie pas de faire attention si ta table connait des mises à jour concurrentielles tu peux avoir des soucis de perfs avec tes indexes bitmap en DML.

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2006
    Messages : 43
    Points : 39
    Points
    39
    Par défaut
    Cette table est utilisée en lecture principalement.

    Les changements dans la table seront plus qu'occasionnels, une fois par mois elle devrait être mise à jour.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Mon index n'est pas utilisé quand j'ajoute un champ
    Par frederic.bouchery dans le forum Requêtes
    Réponses: 10
    Dernier message: 19/03/2012, 14h01
  2. Réponses: 3
    Dernier message: 16/11/2011, 11h26
  3. pourquoi mon site n'est pas indexé par google
    Par lonyc dans le forum Référencement
    Réponses: 0
    Dernier message: 28/10/2008, 21h58
  4. Mon code n'est pas interprété !
    Par korriganez dans le forum Langage
    Réponses: 3
    Dernier message: 31/05/2006, 15h46
  5. Index n'est pas a jour
    Par touhami dans le forum Paradox
    Réponses: 5
    Dernier message: 11/12/2002, 14h47

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