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] - ordre des colonnes d'un index composite


Sujet :

Administration Oracle

  1. #1
    Membre averti
    Inscrit en
    Novembre 2002
    Messages
    549
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 549
    Points : 436
    Points
    436
    Par défaut [INDEX] - ordre des colonnes d'un index composite
    Bonjour,

    RDBMS 9i, 10g, 11g

    J'ai eut une discussion ce matin avec un consultant Oracle sur les index composite (b*tree uniquement) et l'ordre des colonnes, qui me laisse dubitatif.

    jusqu'à présent, je déterminai l'ordre des colonnes par une estimation pour chaque colonne de la sélectivité
    Ma régle simple : ordre des colonnes => de la plus sélective à la moins sélective

    ce matin, nous avons recréé un index sur 3 colonnes avec plusieurs ordres différents

    Résultat : l'index que j'avais créé n'est pas celui qui a le clustering factor le plus faible

    Ma question : quelles régles utilisez vous à ce niveau ? Faut-il étudier chaque combinaison de colonne et déterminer le clustering factor ? -> pour certains index composites sur 15 colonnes que nous avons çà risque d'être chaud !!!

    Merci de votre retour d'expériences à ce niveau
    PpPool

  2. #2
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Mars 2010
    Messages
    536
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 536
    Points : 1 359
    Points
    1 359
    Par défaut
    Citation Envoyé par PpPool Voir le message
    Bonjour,

    RDBMS 9i, 10g, 11g

    J'ai eut une discussion ce matin avec un consultant Oracle sur les index composite (b*tree uniquement) et l'ordre des colonnes, qui me laisse dubitatif.

    jusqu'à présent, je déterminai l'ordre des colonnes par une estimation pour chaque colonne de la sélectivité
    Ma régle simple : ordre des colonnes => de la plus sélective à la moins sélective

    ce matin, nous avons recréé un index sur 3 colonnes avec plusieurs ordres différents

    Résultat : l'index que j'avais créé n'est pas celui qui a le clustering factor le plus faible

    Ma question : quelles régles utilisez vous à ce niveau ? Faut-il étudier chaque combinaison de colonne et déterminer le clustering factor ? -> pour certains index composites sur 15 colonnes que nous avons çà risque d'être chaud !!!

    Merci de votre retour d'expériences à ce niveau
    Ce n'est pas le clustering factor qui décide de l'ordre des colonnes dans l'index. Ce sont vos requêtes qui le dictent. Par exemple, dans le cas où nous voudrions couvrir une requête du type

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
      select *
        from table_t t
     where
         t.a = :1
     and
         t.b = :2
     and
         t.c = :3
    ;
    alors dans ce cas un index du type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     create index ind_t on table_t (a, b, c);
    couvrira bien notre requête

    Mieux encore, les indexes suivants feront également l'affaire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     create index ind_t on table_t (b, c,a);
     create index ind_t on table_t (c, b,a);
     create index ind_t on table_t (b, a,c);
    Bref, n'importe quel index contenant les colonnes a,b, c dans n'importe quel ordre fera l'affaire.

    Mais, il y a toujours un mais quelque part, lorsque nous avons ce genre de choix, il est judicieux de placer la colonne la plus répétée (la moins sélective) en premier. Savez vous pourquoi? et bien c'est pour pouvoir compresser efficacement l'index. La compression d'un index est une option très performante mais malheureusement moins utilisée

    Voilà pourquoi, il est important de suivre le processus suivant lors de la création d'un index

    (a) définir l'index de telle sorte que les colonnes de l'index soient dictées par la requête. Faire très attention à la première colonne de l'index elle doit absolument faire partie de la where clause et elle doit plutot courvir une égalité et non un range (> ou < par exemple)

    (b) placer les colonnes les moins selectives en premiers (mais ceci doit se faire en tenant compte des remarques précédentes)

    Une autre remarque, admettons qu'en plus de la requête précédente, nous avons une autre requête à couvir qui est définie comme suit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     select *
        from table_t t
     where
           t.c = :3
    Quel index allons nous créer?

    Il est donc clair que nous allons créer un seul index pour couvrir les deux requêtes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    create index ind_t2 on table_t (c, b, a);
    ou bien

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
       create index ind_t2 on table_t (c, a, b);
    La colonne c doit absolument être en premier. Il nous reste le choix de placer a ou b en deuxième position; et pour cela, nous utiliserons la colonne la moins sélective en deuxième position

    Bien à vous

    Mohamed Houri
    Bien Respectueusement
    www.hourim.wordpress.com

    "Ce qui se conçoit bien s'énonce clairement"

  3. #3
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Mars 2010
    Messages
    536
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 536
    Points : 1 359
    Points
    1 359
    Par défaut
    Bonjour,

    En complément, je dirai aussi ceci

    Le "clustering factor" est un nombre singulier qui représente le degré de distribution aléatoire des données dans une table. C'est un nombre qui indique la répartition des données dans une table par rapport à l'index

    Ceci dit, comme une table ne peut être ordonnée que d'une seule manière, on pourrait donc veuiller à créér un index de telle sorte que la première colonne de cet index soit celle qui représente le meilleur ordre dans la table. Mais dans ce cas, il faudrait d'abord prendre en considération la présence de ladite colonne dans la requête. Et enfin, sachez que nous ne pourrions pas créér des indexes avec des colonnes différentes et ayant tous un bon clustering factor.

    Bien à vous

    Mohamed Houri
    Bien Respectueusement
    www.hourim.wordpress.com

    "Ce qui se conçoit bien s'énonce clairement"

Discussions similaires

  1. [10gR2] Index : ordre des colonnes
    Par StringBuilder dans le forum Oracle
    Réponses: 7
    Dernier message: 05/09/2014, 16h38
  2. Réponses: 3
    Dernier message: 28/02/2014, 13h12
  3. [MariaDB] Utilisation index fonction des colonnes retournées?
    Par Kaoutchou dans le forum Administration
    Réponses: 4
    Dernier message: 16/05/2013, 11h51
  4. Ordre des colonnes dans in Index
    Par dev-man dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 20/09/2007, 15h22
  5. Réponses: 1
    Dernier message: 02/05/2007, 15h16

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