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?
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:
Vous pouvez également utiliser un Plan Guide , qui définit le plan que vous souhaitez mettre en place.
Les inconvénients sont:
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:
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 .
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.