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 :

Index BITMAP non utilisé


Sujet :

Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Janvier 2011
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 45
    Par défaut Index BITMAP non utilisé
    Bonjour,
    j'ai une table de 75 million de lignes avec une colonne CODE_STE varchar2(2) qui peut avoir cinq valeurs distinctes, donc c'est le cas idéal pour créer un index BITMAP.
    je créé l'index je lance ma requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select col1, col2, ......
    from MA_TABLE
    where CODE_STE ='07';
    Résultat : la requête dure une éternité car oracle fait un full scan de MA_TABLE !!!!!

    Pouriez_vous me dire pourquoi Oracle ne passe pas par mon INDEX ?

    parcontre quand je fais un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select count(*) from MA_TABLE  where CODE_STE ='07';
    Oracle passe par l'index .

  2. #2
    Membre Expert Avatar de ojo77
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Décembre 2010
    Messages
    680
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2010
    Messages : 680
    Par défaut
    Oracle ne prends pas ton index parceque de toutes façon il devra remonter tous les blocs de la table (Oracle ne travaille pas à la ligne mais au bloc pour ses lectures) donc il n'a aucun intérêt à lire l'index.

  3. #3
    Membre averti
    Inscrit en
    Janvier 2011
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 45
    Par défaut
    Normalement on passant par l'index il remontera que les blocs où se trouve les lignes CODE_STE='07' ? c'est le but des index .

  4. #4
    Membre Expert Avatar de ojo77
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Décembre 2010
    Messages
    680
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2010
    Messages : 680
    Par défaut
    Certes mais un bloc contient généralement plusieurs lignes.

    Mettons que chaque bloc contienne 20 lignes. Tu dis n'avoir que 5 valeurs pour pour CODE_STE. Si ces valeurs sont uniformament réparties dans ta table il y a environ 4 lignes par blocs qui réponde à ta demande, donc tous les blocs doivent être remontés.

  5. #5
    Membre averti
    Inscrit en
    Janvier 2011
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 45
    Par défaut
    Non les valeurs de cod_ste ne sont pas uniformément réparties.
    COD_STE a 5 valeurs distincts .

    La table contient 70 millions de lignes mais uniquement 23000 lignes correspondes à COD_STE='07' et à ma connaissance c'est dans ce cas ou il faut utiliser un index BITMAP.

    les lignes de COD_STE='07' c'est des lignes d'une nouvelle société quant vient de rajouter dans la base.

  6. #6
    Membre Expert Avatar de ojo77
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Décembre 2010
    Messages
    680
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2010
    Messages : 680
    Par défaut
    Dans ce cas, il faut calculer des statistiques avec histogrammes sur la colonne CODE_STE, en effet sans histogramme, l'optimiseur Oracle se comporte comme si les données étaient uniformément réparties.

  7. #7
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Par défaut
    dans ce cas effectivement un index scan serait moins cher.

    Quel est l'output de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    set autot trace exp
    select /*+FULL(MA_TABLE)*/ col1,col2 from MA_TABLE where CODE_STE='07';
    select /*+INDEX(MA_TABLE)*/ col1,col2 from MA_TABLE where CODE_STE='07';

  8. #8
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Par défaut
    Citation Envoyé par olap_2001 Voir le message
    Bonjour,
    j'ai une table de 75 million de lignes avec une colonne CODE_STE varchar2(2) qui peut avoir 5 valeurs distinctes, donc c'est le cas idéal pour créer un index BITMAP.
    C'est faux de croire ça.

    Si tu as 5 valeurs distinctes et que tu sélectionnes 20% de la table, il y a de fortes chance que le full table scan soit plus rapide.

    Si tu avais 75 Millions de lignes et un bitmap sur 100'000 valeurs distintes, alors là oui, ce serait le cas idéal.

    Le seul cas où un bitmap de cardinalité 1/15000000 peut se révéler utile, c'est lorsqu'il est employé avec d'autres bitmaps.

    Dans le cas du count(*), c'est très différent car il ne doit pas accèder à la table du tout.

  9. #9
    Expert confirmé
    Avatar de pachot
    Homme Profil pro
    Developer Advocate YugabyteDB
    Inscrit en
    Novembre 2007
    Messages
    1 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Suisse

    Informations professionnelles :
    Activité : Developer Advocate YugabyteDB
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 822
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    La table contient 70 millions de lignes mais uniquement 23000 lignes correspondes à COD_STE='07' et à ma connaissance c'est dans ce cas ou il faut utiliser un index BITMAP.
    Si c'est très selectif, alors un index est intéressant. Dans ce cas avec histogramme, à jour, et en étant sûr de ne pas être en cursor_sharing=force

    Mais pas forçément un index bitmap.

    Vu comme ça, ça me paraît un cas idéal de partitionnement...

    Cordialement,
    Franck.

  10. #10
    Membre averti
    Inscrit en
    Janvier 2011
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 45
    Par défaut
    Mais pas forcément un index bitmap ? il ya très peu de valeur distinctes donc un bitmap est conseillé.

    citation :
    Vu comme ça, ça me paraît un cas idéal de partitionnement...

    justement le DBA nous a suggéré de faire des vues matérialisées sachant que le requête des MV c'est :
    select * from MA_TABLE where CD_STE=A; ou A in ('01','02','03' ....'07')

    moi j'était pour le partitionnement de la table mais d'après le dba c'est mieux de faire des MV !!!!

  11. #11
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    il ya très peu de valeur distinctes donc un bitmap est conseillé.
    archi-faux.

    Un bitmap a de très nombreux inconvénients, et ne convient qu'aux environments style datawarehouse où ils n'y a pas deux utilisateurs qui entrent des données simultanément

    Autant les tables que les vues matérialisées peuvent être partitionées, change de dba

  12. #12
    Membre Expert
    Avatar de doc malkovich
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Juillet 2008
    Messages
    1 884
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 884
    Billets dans le blog
    1
    Par défaut
    Le partitionnement est une option payante, peut-être que vous ne l'avez pas tout simplement ?
    Dans ce cas le DBA "bricole" un pseudo partitionnement avec des VM ...

  13. #13
    Membre averti
    Inscrit en
    Janvier 2011
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 45
    Par défaut
    comment faire pour lire la note MOS n°1149109.1

    désolé je suis nouveau sur le site

  14. #14
    Membre Expert Avatar de ojo77
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Décembre 2010
    Messages
    680
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2010
    Messages : 680
    Par défaut
    Il faut avoir un compte MOS (ou metalink c'est la même chose)

    La note est ici

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

Discussions similaires

  1. Index fullText non utilisé (Version 2)
    Par moumoune65 dans le forum Requêtes
    Réponses: 2
    Dernier message: 21/10/2011, 08h01
  2. Index non utilisé dans une requête
    Par tibal dans le forum Administration
    Réponses: 9
    Dernier message: 10/05/2010, 15h29
  3. [Oracle 11g] Index non utilisé par oracle
    Par eryk71 dans le forum SQL
    Réponses: 12
    Dernier message: 17/02/2009, 10h29
  4. index non utilisé
    Par puck78 dans le forum SQL
    Réponses: 10
    Dernier message: 21/01/2009, 14h36
  5. Oracle8i Index Bitmap non utilisé
    Par persam dans le forum SQL
    Réponses: 2
    Dernier message: 20/06/2008, 15h05

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