web-dev-qa-db-fra.com

Forcer SQL Server à utiliser des index fragmentés?

J'ai une table assez grande (> 10 millions de lignes) avec des opérations crud fréquentes. Il a des index appropriés, mais ils se fragmentent rapidement. Sans un plan de maintenance périodique de réorganisation/reconstruction d'index, la fragmentation de l'index peut facilement dépasser 90%.

Pour l'instant, j'ai résolu ce problème en réorganisant les index quotidiennement et en les reconstruisant chaque semaine. J'ai également joué avec des facteurs de remplissage, etc. pour maintenir la fragmentation plus faible.

Mon principal problème est que lorsque les index sont trop fragmentés, SQL Server ignore les index et effectue des analyses de table complètes à la place. Lorsque cela se produit, cela tue presque l'application, car les analyses répétées d'une telle grande table sont très lourdes. Je suis tout à fait sûr que l'utilisation d'un index fragmenté serait plus rapide dans ces cas.

Existe-t-il un moyen de laisser SQL Server utiliser l'index quelle que soit sa fragmentation?

7
mikaelnet

Index Index

Vous pouvez utiliser un indice index pour ce faire:

SELECT *
FROM dbo.Users AS u WITH (INDEX = ix_definitely_an_index)
WHERE u.Reputation = 2;

Les inconvénients sont:

  • Changer potentiellement beaucoup de code
  • Si vous renommez un index, cela rompt
  • Si vous modifiez une définition d'index, ce n'est peut-être plus le meilleur index à utiliser

Guides de plan

Vous pouvez également utiliser un Plan Guide , qui définit le plan que vous souhaitez mettre en place.

Les inconvénients sont:

  • C'est capricieux; si votre requête n'est pas exactement la même, votre plan risque de ne pas être utilisé
  • C'est difficile à mettre en place; il faut que tout soit parfait
  • Aussi le même truc qu'un indice, donc euh ... C'est rude.

Magasin de requêtes?

Puisque vous êtes sur SQL Server 2017, vous pourrez peut-être utiliser Query Store pour forcer les plans . C'est beaucoup plus facile que d'utiliser un guide de plan, mais vous pouvez vous retrouver avec un plan inattend .

Inconvénients:

  • Mêmes choses que ci-dessus
  • Devoir activer Query Store, si vous ne l'utilisez pas déjà
  • Devoir interroger le magasin de requêtes pour voir si les plans forcés échouent

Alternatives

Sans en savoir plus, je serais probablement plus enclin à rechercher si l'utilisation de l'index change pour d'autres raisons, comme reniflage de paramètres .

14
Erik Darling

La prochaine fois que SQL Server ignore l'index, essayez de mettre à jour les statistiques avec FULL SCAN sur cet index ou sur la table entière. Si cela fonctionne, la fragmentation n'est pas un problème.

SQL Server ne se soucie pas non plus de la fragmentation lors du choix d'un plan, mais il peut ignorer l'index s'il devient trop volumineux en raison de la "fragmentation interne". Veuillez vérifier l'espace vide à l'intérieur des pages de votre index.

1
Alexander Suprun