190
Chapitre 6. Utilisation des index
Avec les deux affichages précédents, l’optimiseur SQL sait quel est le nombre de
lignes dans la table, et le nombre de valeurs distinctes dans la colonne indexée. Il lui
faut maintenant pouvoir évaluer, pour une certaine valeur de colonne, quel sera le
nombre approximatif de lignes concernées (combien ProductId = 760 concerne-t-il
de lignes ?). Pour cela, il maintient un échantillonnage des valeurs établi selon un
certain nombre de sauts (les steps que nous avons vus dans les informations de header), sous forme d’un tableau. Dans notre exemple, un tableau de 200 steps. SQL Server crée un maximum de 200 steps par statistiques. La signification des colonnes est
détaillée dans le tableau 6.8.
Tableau 6.8 — Signification des colonnes
Nous voyons donc ici comment l’optimiseur a estimé le nombre de lignes retournées par la clause WHERE ProductId = 760 : il s’est positionné sur l’échantillon 779,
puisque la valeur 760 est contenue dans l’ensemble échantillonné de cette ligne, et
a retrouvé la valeur de AVG_RANGE_ROWS. Dans la case de ProductId = 800, l’optimiseur a trouvé la ligne où le RANGE_HI_KEY = 800. Le nombre d’EQ_ROWS est 418. Pourquoi l’optimiseur fait-il le choix de parcourir la table au lieu d’utiliser l’index ?
Sachant qu’il aura à retourner 418 lignes, cela fait donc potentiellement un maximum de 418 pages de 8 Ko en plus des pages de l’index à parcourir. Nous savons,
grâce à la requête suivante, combien de pages sont utilisées par chaque index :
SELECT o.name AS table_name,
p.index_id,
i.name AS index_name,
319
218
118
2
72
...
779
37
771
7 5,285714
Colonne
Contenu
RANGE_HI_KEY
La valeur de colonne de l’échantillon, donc de la dernière
ligne de l’ensemble échantillonné (le bucket)
RANGE_ROWS
Le nombre de lignes entre l’échantillon et l’échantillon
précédent, ces deux échantillons non compris
EQ_ROWS
Nombre de lignes dans l’ensemble dont la valeur est égale à
celle de l’échantillon
DISTINCT_RANGE_ROWS
Nombre de valeurs distinctes dans l’ensemble
AVG_RANGE_ROWS
Nombre moyen de lignes de l’ensemble ayant la même
valeur, donc RANGE_ROWS / DISTINCT_RANGE_ROWS
RANGE
_HI_KEY
RANGE
_ROWS
EQ_ROWS
DISTINCT
_RANGE_ROWS
AVG
_RANGE_ROWS
➤
Précédent

- 202/334

Suivant