|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Membre éclairé
![]() Inscription : novembre 2002 Messages : 532 ![]() |
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 |
|
|
00
|
|
|
#2 | |||||||||||||
|
Membre expérimenté
![]() Mohamed HouriInscription : mars 2010 Messages : 286 ![]() |
Citation:
Code :
Code :
Mieux encore, les indexes suivants feront également l'affaire Code :
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 :
Il est donc clair que nous allons créer un seul index pour couvrir les deux requêtes Code :
Code :
Bien à vous Mohamed Houri |
|||||||||||||
|
|
00
|
|
|
#3 |
|
Membre expérimenté
![]() Mohamed HouriInscription : mars 2010 Messages : 286 ![]() |
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 |
|
|
10
|
Copyright © 2000-2012 - www.developpez.com