167
6.1 Principes de l’indexation
JOIN sys.objects o ON i.object_id = o.object_id
WHERE fill_factor <> 0
ORDER BY table_name;
Il est évident que le FILLFACTOR n’est appliqué qu’à la création et reconstruction
de l’index. Il n’est pas automatiquement maintenu. Si vous réorganisez votre armoire
en décidant de ne remplir vos boîtes à fiches qu’à moitié pour laisser de la place pour
les futurs dossiers, vous n’allez pas toujours conserver ce remplissage à 50 % à l’ajout
de chaque dossier : cela équivaudrait à ne rien changer au problème, en prenant plus
de place pour le tout. Si vous voulez maintenir une valeur de FILLFACTOR, il faut donc
appliquer un plan de maintenance de vos index, pour les réorganiser ou les reconstruire régulièrement.
Pour cela, vous disposez de deux commandes :
ALTER INDEX... REBUILD reconstruit totalement l’index. Vous pouvez, en édition
Entreprise, indiquer une reconstruction ONLINE. Les options de l’index spécifiées à la
création (dont le FILLFACTOR) sont conservées. En cas de reconstruction d’un index
clustered, les index nonclustered ne sont pas reconstruits. Pour tout reconstruire en
une fois, utilisez cette syntaxe :
ALTER INDEX ALL ON Person.Contact REBUILD;
Vous pouvez changer au passage les options, comme le FILLFACTOR :
ALTER INDEX nix$Person_Contact$LastName
ON Person.Contact
REBUILD WITH (FILLFACTOR = 50);
En mode de récupération simple (ou en mode journalisé en bloc), cette opération
est loguée de façon minimale, et est donc plus légère.
ALTER INDEX... REORGANIZE réorganise seulement le nœud feuille de l’index.
C’est une commande plus rapide, qui est toujours exécutée ONLINE, même en édition
Standard. Les pages sont compactées selon la valeur du FILLFACTOR indiquée à la
création de l’index. C’est une commande idéale pour traiter rapidement un index
peu fragmenté.
Mais, bien sûr, la question est de savoir si un index est fragmenté… La fonction
de gestion dynamique sys.dm_db_index_physical_stats est là pour ça.
Démonstration :
CREATE INDEX nix$Person_Contact$FirstName
ON Person.Contact (FirstName)
SELECT index_id, *
FROM sys.indexes
WHERE name = 'nix$Person_Contact$FirstName'
AND object_id = OBJECT_ID('Person.Contact')
SELECT * FROM sys.dm_db_index_physical_stats
(DB_ID(N'AdventureWorks'),
OBJECT_ID(N'Person.Contact'), 22, NULL , 'DETAILED')
6.1 Principes de l’indexation
JOIN sys.objects o ON i.object_id = o.object_id
WHERE fill_factor <> 0
ORDER BY table_name;
Il est évident que le FILLFACTOR n’est appliqué qu’à la création et reconstruction
de l’index. Il n’est pas automatiquement maintenu. Si vous réorganisez votre armoire
en décidant de ne remplir vos boîtes à fiches qu’à moitié pour laisser de la place pour
les futurs dossiers, vous n’allez pas toujours conserver ce remplissage à 50 % à l’ajout
de chaque dossier : cela équivaudrait à ne rien changer au problème, en prenant plus
de place pour le tout. Si vous voulez maintenir une valeur de FILLFACTOR, il faut donc
appliquer un plan de maintenance de vos index, pour les réorganiser ou les reconstruire régulièrement.
Pour cela, vous disposez de deux commandes :
ALTER INDEX... REBUILD reconstruit totalement l’index. Vous pouvez, en édition
Entreprise, indiquer une reconstruction ONLINE. Les options de l’index spécifiées à la
création (dont le FILLFACTOR) sont conservées. En cas de reconstruction d’un index
clustered, les index nonclustered ne sont pas reconstruits. Pour tout reconstruire en
une fois, utilisez cette syntaxe :
ALTER INDEX ALL ON Person.Contact REBUILD;
Vous pouvez changer au passage les options, comme le FILLFACTOR :
ALTER INDEX nix$Person_Contact$LastName
ON Person.Contact
REBUILD WITH (FILLFACTOR = 50);
En mode de récupération simple (ou en mode journalisé en bloc), cette opération
est loguée de façon minimale, et est donc plus légère.
ALTER INDEX... REORGANIZE réorganise seulement le nœud feuille de l’index.
C’est une commande plus rapide, qui est toujours exécutée ONLINE, même en édition
Standard. Les pages sont compactées selon la valeur du FILLFACTOR indiquée à la
création de l’index. C’est une commande idéale pour traiter rapidement un index
peu fragmenté.
Mais, bien sûr, la question est de savoir si un index est fragmenté… La fonction
de gestion dynamique sys.dm_db_index_physical_stats est là pour ça.
Démonstration :
CREATE INDEX nix$Person_Contact$FirstName
ON Person.Contact (FirstName)
SELECT index_id, *
FROM sys.indexes
WHERE name = 'nix$Person_Contact$FirstName'
AND object_id = OBJECT_ID('Person.Contact')
SELECT * FROM sys.dm_db_index_physical_stats
(DB_ID(N'AdventureWorks'),
OBJECT_ID(N'Person.Contact'), 22, NULL , 'DETAILED')
