189
6.4 Statistiques
lée seulement pour celle-ci. Les densités calculées sont ensuite celles des colonnes
agrégées dans l’ordre de leur présence dans l’index (le préfixe de la clé), une colonne
après l’autre, si l’index est composite, ou si l’index est nonclustered et présent sur une
table clustered. Dans ce cas, comme nous le voyons ici, chaque index nonclustered
contiendra la ou les colonnes de l’index clustered en dernière position.
La densité est donnée par le nombre moyen de lignes pour une valeur de la
colonne divisé par le nombre total de lignes. Le nombre moyen de lignes est calculé
en prenant le nombre total de ligne (T) divisé par le nombre de valeurs distinctes
(VD) dans la colonne. Ce qui donne :
(T / VD) / T qui équivaut à 1 / VD
Et en effet :
SELECT 1.00 / COUNT(DISTINCT ProductId))
FROM Production.TransactionHistory
retourne bien 0,0022675736961
Plus la densité est faible, plus la sélectivité est élevée, et plus l’index est utile. La
sélectivité maximale est offerte par un index unique, comme ici l’index clustered unique sur la clé primaire de la table.
La densité de la colonne unique est donc 1 / VD, qui correspond logiquement à
1 / T, puisque le nombre de valeurs distinctes équivaut au nombre de lignes de la
table.
SELECT 1.00 / COUNT(*)
FROM Production.TransactionHistory
retourne 0,0000088149996, ce qui représente une très basse densité, donc une
sélectivité très élevée. Pour vérifier que nous obtenons bien la même valeur que la
deuxième densité (ProductID, TransactionID), forçons la notation scientifique en
retournant une donnée FLOAT :
SELECT CAST(1.00 as float) / COUNT(*)
FROM Production.TransactionHistory
qui donne une valeur approximative de 8,815E-06, CQFD.
Le couple ProductID + TransactionID ne peut être que d’une sélectivité maximale, puisqu’incluant une colonne unique, chaque ligne est donc unique, et sa densité est 1 / T.
Tableau 6.7 — Échantillonnage
RANGE
_HI_KEY
RANGE
_ROWS
EQ_ROWS
DISTINCT
_RANGE_ROWS
AVG
_RANGE_ROWS
1
4 5
4 5
0
1
3
45
307
1
45
316
144
307
1
45
➤
6.4 Statistiques
lée seulement pour celle-ci. Les densités calculées sont ensuite celles des colonnes
agrégées dans l’ordre de leur présence dans l’index (le préfixe de la clé), une colonne
après l’autre, si l’index est composite, ou si l’index est nonclustered et présent sur une
table clustered. Dans ce cas, comme nous le voyons ici, chaque index nonclustered
contiendra la ou les colonnes de l’index clustered en dernière position.
La densité est donnée par le nombre moyen de lignes pour une valeur de la
colonne divisé par le nombre total de lignes. Le nombre moyen de lignes est calculé
en prenant le nombre total de ligne (T) divisé par le nombre de valeurs distinctes
(VD) dans la colonne. Ce qui donne :
(T / VD) / T qui équivaut à 1 / VD
Et en effet :
SELECT 1.00 / COUNT(DISTINCT ProductId))
FROM Production.TransactionHistory
retourne bien 0,0022675736961
Plus la densité est faible, plus la sélectivité est élevée, et plus l’index est utile. La
sélectivité maximale est offerte par un index unique, comme ici l’index clustered unique sur la clé primaire de la table.
La densité de la colonne unique est donc 1 / VD, qui correspond logiquement à
1 / T, puisque le nombre de valeurs distinctes équivaut au nombre de lignes de la
table.
SELECT 1.00 / COUNT(*)
FROM Production.TransactionHistory
retourne 0,0000088149996, ce qui représente une très basse densité, donc une
sélectivité très élevée. Pour vérifier que nous obtenons bien la même valeur que la
deuxième densité (ProductID, TransactionID), forçons la notation scientifique en
retournant une donnée FLOAT :
SELECT CAST(1.00 as float) / COUNT(*)
FROM Production.TransactionHistory
qui donne une valeur approximative de 8,815E-06, CQFD.
Le couple ProductID + TransactionID ne peut être que d’une sélectivité maximale, puisqu’incluant une colonne unique, chaque ligne est donc unique, et sa densité est 1 / T.
Tableau 6.7 — Échantillonnage
RANGE
_HI_KEY
RANGE
_ROWS
EQ_ROWS
DISTINCT
_RANGE_ROWS
AVG
_RANGE_ROWS
1
4 5
4 5
0
1
3
45
307
1
45
316
144
307
1
45
➤
