Bonjour,
Je pensais avoir compris comment fonctionnait le Clustering Factor en lisant plusieurs sites et voila que j'ai un doute en regardant ma base de production.
J'ai une table de nom CABN_CURRENT_ACCDATE_SECBAL avec 1 992 109 enregistrements.
TOAD me donne un avg_row_len de 79 dans l'onglet des stats, un paramètre Size de 168 Mb (taille de la table sur disque dur?) et un paramètre Blocks de 21 248 (mon db_block_size est de 8Ko).
Cette table a une PK sur le champ CAB_ID NUMBER(12) et dessus un index appelé PK_CABN.
Pour cet index Toad me donne les infos suivantes :
- Leaf blocks : 4 681
- Distinct keys : 1 992 038
- Clustering facor : 1 552 312
Ce clustering factor est très élevé par rapport au nombre de feuilles de mon index.
Ce que je comprends c'est que si je devais parcourir en entier l'index pour récupérer chaque ligne de ma table, Oracle devrait effectuer 1 552 312 lecture (donc lire 1 552 312 blocs de données?) pour lire mes 1 992 109 enregistrements. C'est là que je doute car le nombre de blocs à lire serait largement supérieur au nombre de blocs de ma table : 21 248 blocs
Ce que je comprends c'est que Oracle va lire N fois le même bloc mais pas au même instant pour récupérer les données car un Clustering factor élevé signifie que la table n'est pas ordonnée comme l'index. Donc dans mes blocs d'index j'ai à la suite "que" des ROWID correspondant à des blocs de données différents donc pour un enregistrement dans mon index j'ai une lecture d'un bloc de données.
Désolé si ce n'est pas très clair, c'est pour cela que je pose la question
Etes-vous d'accord avec mon interprétation ou bien je me suis fourvoyé?
Autre question : dans quels cas on a un Clustering Factor = au nombre de feuilles dans l'index? Si j'ai bien compris c'est l'objectif d'un bon CF : être proche du nombre de feuilles.
Par exemple j'ai une table avec un champ et un seul qui est un ID et que je créé un index sur ce champ en respectant l'ordre de la table?
Partager