172
Chapitre 6. Utilisation des index
/* -- résultat
index_depth index_level page_count
record_count
----------- ----------- -------------------- -------------------6
0
1441
8000
6
1
321
1441
6
2
72
321
6
3
16
72
6
4
3
16
6
5
1
3
*/
SELECT index_depth, index_level, page_count, record_count
FROM sys.dm_db_index_physical_stats(
DB_ID(), OBJECT_ID('dbo.testIndex'), 3, NULL, 'DETAILED')
/* -- résultat
index_depth index_level page_count
record_count
----------- ----------- -------------------- -------------------2
0
14
8000
2
1
1
14
*/
Nous créons d’abord une base de données pour y jouer, que nous mettons en
mode de récupération simple afin d’éviter une augmentation inutile de la taille du
journal. Nous créons ensuite une table de test, en faisant en sorte que chaque ligne
remplisse une page. Nous y ajoutons deux colonnes pour y appliquer des index : l’une
fait 900 octets (la taille maximale d’une clé d’index), l’autre un simple smallint
(2 octets). Nous indexons ces deux colonnes. L’une est clé primaire, l’autre clé candidate. Le fait que ces index soient uniques n’a pas d’importance dans cet exemple,
la structure de l’index n’est en rien différente.
Nous créons une insertion en boucle, de façon à y insérer 8000 lignes. Nous utilisons sys.indexes pour retrouver l’identifiant de chaque index. L’index lourd porte
l’ID 2, le léger, l’ID 3. Nous en observons ensuite la taille à l’aide de la fonction système sys.dm_db_index_physical_stats. Ce que nous constatons, c’est que l’index
lourd est profond, et nécessairement étendu (peu de clés peuvent résider dans la
même page) : six niveaux pour un total de 1 854 pages. L’index léger, lui, comporte
deux niveaux pour un total de 15 pages. Observons la différence sur les requêtes :
SET STATISTICS IO ON
SELECT * FROM dbo.testIndex WHERE CodeLong = '49'
-- Table 'testIndex'. Scan count 0, logical reads 7
SELECT * FROM dbo.testIndex WHERE CodeCourt = 49
-- Table 'testIndex'. Scan count 0, logical reads 3
La recherche avec l’index léger doit lire trois pages, contre sept pages pour celle
qui s’applique à l’index lourd.
Chapitre 6. Utilisation des index
/* -- résultat
index_depth index_level page_count
record_count
----------- ----------- -------------------- -------------------6
0
1441
8000
6
1
321
1441
6
2
72
321
6
3
16
72
6
4
3
16
6
5
1
3
*/
SELECT index_depth, index_level, page_count, record_count
FROM sys.dm_db_index_physical_stats(
DB_ID(), OBJECT_ID('dbo.testIndex'), 3, NULL, 'DETAILED')
/* -- résultat
index_depth index_level page_count
record_count
----------- ----------- -------------------- -------------------2
0
14
8000
2
1
1
14
*/
Nous créons d’abord une base de données pour y jouer, que nous mettons en
mode de récupération simple afin d’éviter une augmentation inutile de la taille du
journal. Nous créons ensuite une table de test, en faisant en sorte que chaque ligne
remplisse une page. Nous y ajoutons deux colonnes pour y appliquer des index : l’une
fait 900 octets (la taille maximale d’une clé d’index), l’autre un simple smallint
(2 octets). Nous indexons ces deux colonnes. L’une est clé primaire, l’autre clé candidate. Le fait que ces index soient uniques n’a pas d’importance dans cet exemple,
la structure de l’index n’est en rien différente.
Nous créons une insertion en boucle, de façon à y insérer 8000 lignes. Nous utilisons sys.indexes pour retrouver l’identifiant de chaque index. L’index lourd porte
l’ID 2, le léger, l’ID 3. Nous en observons ensuite la taille à l’aide de la fonction système sys.dm_db_index_physical_stats. Ce que nous constatons, c’est que l’index
lourd est profond, et nécessairement étendu (peu de clés peuvent résider dans la
même page) : six niveaux pour un total de 1 854 pages. L’index léger, lui, comporte
deux niveaux pour un total de 15 pages. Observons la différence sur les requêtes :
SET STATISTICS IO ON
SELECT * FROM dbo.testIndex WHERE CodeLong = '49'
-- Table 'testIndex'. Scan count 0, logical reads 7
SELECT * FROM dbo.testIndex WHERE CodeCourt = 49
-- Table 'testIndex'. Scan count 0, logical reads 3
La recherche avec l’index léger doit lire trois pages, contre sept pages pour celle
qui s’applique à l’index lourd.
