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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Inscrit en
    Mai 2002
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 19
    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
    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
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    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
    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
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    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
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967

  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
    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

+ 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