Notre projet gère une très grande base de données très compliquée. Il y a environ un mois, nous avons remarqué que l'espace utilisé par les colonnes indexées contenant des valeurs nulles devenait trop grand. En réponse à cela, j'ai écrit un script qui rechercherait dynamiquement tous les index à colonne unique contenant plus de 1% de valeurs nulles, puis supprimerait et recréerait ces index en tant qu'index filtrés à condition que la valeur ne soit PAS NUL. Cela supprimerait et recréerait des centaines d'index dans la base de données et libérerait généralement près de 15% de l'espace utilisé par l'ensemble de la base de données.
Maintenant, j'ai deux questions à ce sujet:
A) Quels sont les inconvénients de l'utilisation d'index filtrés de cette manière? Je suppose que cela ne ferait qu'améliorer les performances, mais y a-t-il des risques de performances impliqués?
B) Nous avons reçu des erreurs ( 'impossible de supprimer l'index XYZ car il n'existe pas ou vous n'avez pas la permission' ) lors de la suppression et de la recréation des index, même si, après vérification, tout s'est déroulé exactement comme prévu. Comment cela peut-il arriver?
Merci pour toute aide!
Edit: En réponse à @Thomas Kejser
Salut et merci, mais il s'est avéré que c'était un désastre. À l'époque, nous ne comprenions pas plusieurs choses telles que:
- Lors d'une requête, SQLOS crée des plans d'index avant de déterminer qu'il ne peut pas utiliser de valeurs NULL pour joindre des colonnes de table. IE, vous avez vraiment besoin d'un filtre de clause WHERE ajustant l'index pour chaque index filtré utilisé dans la requête, sinon l'index ne sera pas utilisé du tout.
- La suppression et la création d'index et la mise à jour redondante de leurs statistiques une fois de plus par la suite peuvent ne pas suffire pour produire les plans mis à jour, ce que nous supposions. Il semble que dans certains cas, seule une charge de travail suffisamment élevée obligera SQL Server à réévaluer les plans.
- Il existe des éléments exotiques dans la fonctionnalité du planificateur d'exécution qui sont difficiles à déterminer par le seul bon sens et la seule logique. Avec des milliers de variations générées par le code de différentes requêtes, des index apparemment inutiles peuvent aider dans certaines statistiques et plans de requête qui finissent par être utilisés dans des requêtes critiques.
Finalement, ces changements ont été annulés. Les index filtrés sont donc un outil puissant, mais vous devez vraiment comprendre exactement quelles données sont extraites de ces colonnes. Là où les index normaux mis à part les problèmes d'espace sont plutôt faciles à appliquer, les index filtrés représentent des solutions très personnalisées. Ils ne remplacent certainement pas un index régulier, mais plutôt une extension de ceux-ci dans les circonstances particulières dont ils ont besoin.