web-dev-qa-db-fra.com

À quelle fréquence les index doivent-ils être reconstruits dans notre base de données SQL Server?

Actuellement, notre base de données a une taille de 10 Go et augmente d'environ 3 Go par mois. Souvent, j'entends qu'il faut de temps en temps reconstruire les index, pour améliorer le temps d'exécution des requêtes. Alors, à quelle fréquence dois-je reconstruire les index dans le scénario donné?

32
HotTester

Il existe un consensus général selon lequel vous devez réorganiser ("défragmenter") vos indices dès que la fragmentation de l'indice atteint plus de 5 (parfois 10%), et vous devez les reconstruire complètement lorsqu'elle dépasse 30% (du moins c'est le nombre que je ' ai entendu plaidé dans de nombreux endroits).

Michelle Ufford (alias "SQL Fool") a un script de défragmentation d'index automatisé , qui utilise ces limites exactes pour décider quand réorganiser ou reconstruire un index.

Voir aussi les conseils de Brad McGehee sur la reconstruction des index avec quelques bonnes réflexions et conseils sur la façon de gérer la reconstruction d'index.


J'utilise ce script ici (je ne me souviens pas quand je l'ai reçu de - qui que ce soit: merci beaucoup! Des trucs vraiment utiles) pour afficher la fragmentation d'index sur tous vos index dans une base de données donnée:

SELECT 
    t.NAME 'Table name',
    i.NAME 'Index name',
    ips.index_type_desc,
    ips.alloc_unit_type_desc,
    ips.index_depth,
    ips.index_level,
    ips.avg_fragmentation_in_percent,
    ips.fragment_count,
    ips.avg_fragment_size_in_pages,
    ips.page_count,
    ips.avg_page_space_used_in_percent,
    ips.record_count,
    ips.ghost_record_count,
    ips.Version_ghost_record_count,
    ips.min_record_size_in_bytes,
    ips.max_record_size_in_bytes,
    ips.avg_record_size_in_bytes,
    ips.forwarded_record_count
FROM 
    sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, 'DETAILED') ips
INNER JOIN  
    sys.tables t ON ips.OBJECT_ID = t.Object_ID
INNER JOIN  
    sys.indexes i ON ips.index_id = i.index_id AND ips.OBJECT_ID = i.object_id
WHERE
    AVG_FRAGMENTATION_IN_PERCENT > 0.0
ORDER BY
    AVG_FRAGMENTATION_IN_PERCENT, fragment_count
39
marc_s

"Quand vous en avez besoin" et "Quand vous le pouvez"!

Par exemple...

  • Testez d'abord la fragmentation et décidez de ne rien faire, de réorganiser ou de reconstruire. le script de SQL Fool fait cela , par exemple, a @minFragmentation et @rebuildThreshold paramètres

  • Faites des statistiques quotidiennement, disons, mais indexez les week-ends. Quelle est votre fenêtre de maintenance?

5
gbn

Vous devez reconstruire les index suffisamment souvent pour que la production ne soit pas affectée par la dégradation des index. Je comprends que cela semble vague, mais toutes les bases de données sont différentes et sont utilisées de différentes manières. Vous n'avez qu'à reconstruire/défragmenter régulièrement les index qui entraînent des opérations d'écriture (insertions/mises à jour) - vos tables statiques ou principalement en lecture seule n'auront pas besoin de beaucoup de réindexation.

Vous devrez utiliser dbcc showcontig([Table]) pour vérifier le niveau de fragmentation de vos index, déterminer leur fréquence de fragmentation et le niveau réel de la fragmentation.

Utilisez dbcc dbreindex([Table]) pour reconstruire totalement les index lorsqu'ils deviennent trop fragmentés (au-dessus de 20% -30% environ) mais si vous ne trouvez pas une fenêtre d'indisponibilité suffisamment grande et que le niveau de fragmentation est relativement faible (1% -25 %), vous devez utiliser dbcc indexdefrag([Database], [Table], [Index]) pour défragmenter l'index dans une passion "en ligne". Gardez également à l'esprit que vous pouvez arrêter l'opération de défragmentation d'index et la redémarrer ultérieurement sans perdre de travail.

Garder une base de données et ses index "en phase" nécessite un peu de surveillance pour vraiment savoir quand et quoi réindexer.

2
NTDLS

Compte tenu de la taille de votre base de données, vous pouvez facilement reconstruire les index une fois par mois. Mais à mesure que la taille augmente, par exemple à environ 500 Go, vous pouvez le faire deux fois par mois.

1
Coder