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

Administration Oracle Discussion :

Index sur un booléen ?


Sujet :

Administration Oracle

  1. #1
    Membre à l'essai
    Inscrit en
    Mai 2002
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 19
    Points : 16
    Points
    16
    Par défaut Index sur un booléen ?
    Salut,

    Bon voilà j'ai une table avec plusieurs centaines de milliers de lignes.
    Je viens de créer une colonne NUMBER(1) que je vais utiliser comme booléen avec les valeurs 0 et 1.
    Je sais par avance qu'en permanence seulement une centaine de lignes auront la valeur 1, les autres 0.

    Je vais effectuer de nombreuses fois le SELECT me permettant de retrouver ces quelques lignes ayant la valeur 1.

    Est-ce utile de créer un index sur cette colonne pour accélérer mes requêtes ?
    Dois-je indexer la colonne normalement ou puis-je seulement m'intéresser à la valeur 1 ?

    Merci

  2. #2
    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
    Points : 4 926
    Points
    4 926
    Par défaut
    tu peux par exemple ne pas indexer la valeur 0 avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    create index i on t(nullif(c,0));
    et après tu fais ton select
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select * from t where nullif(c,0) is not null;
    Une solution très rapide pour le select mais vraiment déconseillée en OLTP à cause des verrous serait de créer un index bitmap.

    A+
    Laurent

  3. #3
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    L'index BITMAP est fait pour ça sinon

  4. #4
    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
    Points : 4 926
    Points
    4 926
    Par défaut
    Citation Envoyé par orafrance
    L'index BITMAP est fait pour ça sinon
    l'index bitmap est fait pour une colonne a faible cardinalité (1000 valeurs différentes sur 100000 lignes c'est déjà une faible cardinalité, pas besoin d'avoir 1/1000000) et sur laquelle il n'y a pas d'update simultanés, ni d'insert, ni de delete.

    Donc si tu es en Datawarehouse, c'est ok. En OLTP, JAMAIS

  5. #5
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    1° attention, même à faible cardinalité, il ne faut pas dépasser les 10 valeurs parce que pour chacune des valeurs Oracle stocke la TOTALITE des lignes, donc produit cartésien et risque de grosses pertes de perf.

    Ensuite... 2 ça parait être une cardinalité suffisamment faible

    Sinon, j'vois pas pourquoi en OLTP c'est pas intéressant (j'imagine que la colonne ne pourra changer de valeur qu'une seule fois )

  6. #6
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073

  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
    Points : 4 926
    Points
    4 926
    Par défaut
    une petite démo :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    create table t(id number primary key,genre varchar2(10));
    create bitmap index i on t(genre);
    session 1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    insert into t values (1,'MALE');
    -- ne pas quitter
    session 2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    insert into t values (2,'MALE');
    l'insert a bloqué toute la table à cause de l'index bitmap

  8. #8
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    ha oui, tu as raison, j'avais pas pensé à ce cas

  9. #9
    Membre à l'essai
    Inscrit en
    Mai 2002
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 19
    Points : 16
    Points
    16
    Par défaut
    Ok merci pour vos réponses.

  10. #10
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    J'avais glané quelques articles interressants sur les BITMAP (en anglais)

    Les deadlocks :
    http://www.akadia.com/services/ora_bitmapped_index.html

    Comment c'est codé un index BITMAP (niveau +)
    http://www.dbazine.com/oracle/or-articles/jlewis3

    En français, plus visuel (mais moins précis)
    http://perso.enst.fr/~saglio/bdas/00/orapbs/sld034.htm
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

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

Discussions similaires

  1. Création d'index sur attribut booléen
    Par alex2746 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 16/05/2010, 14h08
  2. Index sur une col. de type 'booléen": utile?
    Par Atreides dans le forum Oracle
    Réponses: 2
    Dernier message: 28/01/2005, 13h12
  3. [Debutant][Tableau] Tableau indexé sur chaine de caractères
    Par SamRay1024 dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 07/05/2004, 11h14
  4. n INDEXs sur chaque champ ou 1 seul INDEX sur n ch
    Par fourchette dans le forum Requêtes
    Réponses: 2
    Dernier message: 22/04/2004, 10h55
  5. [Sybase] Utilisation indexes sur table Proxy
    Par MashiMaro dans le forum Sybase
    Réponses: 2
    Dernier message: 20/02/2004, 10h20

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