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 :

Dans la catégorie "Pourquoi mon index n'est pas utilisé?"


Sujet :

Oracle

  1. #1
    Membre éprouvé Avatar de Jidefix
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    742
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Septembre 2006
    Messages : 742
    Points : 1 154
    Points
    1 154
    Par défaut Dans la catégorie "Pourquoi mon index n'est pas utilisé?"
    Bonjour,
    je sais que la question a été posée des millions de fois mais quand même là c'est un peu gros:
    j'ai une table de 10 millions de lignes environ, avec une cinquantaine de colonnes.
    La colonne colonne1 est un VARCHAR2(100) avec un index directement dessus.

    Je fais un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SELECT * FROM matable
    WHERE colonne1 = 'Ma Valeur'
    l'index est bien utilisé (vérifié via explain plan), j'ai mes 27 lignes de résultat en 150 ms environ

    Maintenant je tente un truc de fou:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT * FROM matable
    WHERE colonne1 = 'Ma Valeur'
    order by colonne2
    Et là c'est le drame: je retombe en full table scan, je récupère mes 27 lignes triées en 1 minutes.

    En utilisant un hint:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT /*+ index(matable monindex) */ * FROM matable
    WHERE colonne1 = 'Ma Valeur'
    order by colonne2
    , je retrouve mes 150 ms


    Sauf qu'inclure un hint dans mon application ne m'arrange pas vraiment.
    Comment un simple order by peut-il changer le plan d'exécution à ce point? Au pire je ferai le tri dans mon appli mais c'est quand même dommage...


    Détails techniques:
    - Oracle 10G
    - la table et l'index ont été analysés juste avant la requête
    - il y a un index sur colonne2, qui ne semble pas être utilisé pour ces 3 requêtes...

    Quelqu'un a une idée?
    Veuillez agréer nos sentiments les plus distingués. Soyez assurés de notre entière collaboration, bien à vous pour toujours et à jamais dans l'unique but de servir l'espérance de votre satisfaction, dis bonjour à ton père et à ta mère, bonne pétanque, mets ton écharpe fais froid dehors.

  2. #2
    Membre expert
    Avatar de Golgotha
    Homme Profil pro
    Full-stack Web Developer
    Inscrit en
    Août 2007
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Full-stack Web Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2007
    Messages : 1 386
    Points : 3 531
    Points
    3 531
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Pourquoi un select * ?

    Sinon, je sais pas trop.... qu'est ce que ça donne ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT c1,c2 
    FROM (SELECT c1,c2 FROM matable WHERE c1 = 'Ma Valeur')
    ORDER BY c2
    Consultant et développeur full-stack spécialiste du Web
    faq jQuery - règles du forum - faqs web

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 412
    Points : 807
    Points
    807
    Par défaut Le mieux, c'est encore d'avoir l'avis du principal interesse
    Ce que l'optimiseur fait, il n'y a que lui qui le sait. Mais, comme il est cool, il veut bien nous donner des gros indices:
    l'event 10053, ca répondra a toute vos questions

    Un petit lien pour expliquer:
    http://www.centrexcc.com/A%20Look%20...0Event.ppt.pdf

  4. #4
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Que est-ce que ça donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT /*+ gather_plan_statistics */ 
      FROM matable
     WHERE colonne1 = 'Ma Valeur'
    suivi de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    select * 
    from table(dbms_xplan.display_cursor(null,null,'ALLSTATS LAST'));
    Comparez surtout les cardinalités estimés (E-Rows) avec les cardinalités réelles (A-Rows)

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. mon index n'est pas utilisé
    Par varex dans le forum Débuter
    Réponses: 8
    Dernier message: 14/01/2010, 15h40
  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. Réponses: 6
    Dernier message: 12/02/2007, 19h24
  5. [C# 2.0] Pourquoi mon DataAdapter n'est pas instancié ?
    Par FraktaL dans le forum Services Web
    Réponses: 2
    Dernier message: 04/07/2006, 00h04

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