2012-05-11 5 views
9

Pour les tables "volumineuses", y a-t-il une raison de ne pas mettre un filtre sur les index pour les colonnes optionnelles? Donc, pour un index sur la colonne AAA (parce que les gens peuvent rechercher sur AAA),
je peux définir le filtre à ([AAA] IS NOT NULL).
Cela économise du stockage, ce qui permet d'économiser de l'argent.Index filtrés SQL: dois-je toujours mettre un filtre sur un index pour les colonnes optionnelles?

Quelques autres avantages de technet:

  • performances d'une requête et une meilleure qualité Plan
  • Réduction des coûts d'entretien de l'indice
  • Réduction des coûts de stockage d'index

Les gens disent qu'il est bon de mettre un filtre sur un index pour les colonnes qui sont pour la plupart vides. Mais pourquoi ne pas mettre un filtre sur les index pour les colonnes qui sont vides pour 1%? Y at-il une raison de ne pas le faire si cela ne présente que des avantages?

Répondre

5

Ceci est généralement une bonne idée avec deux gotchas:

  1. Le concepteur de table a un bug (Pré Denali!). Quand il reconstruit une table, il supprime tous les filtres.
  2. Assurez-vous que l'optimiseur peut indiquer statiquement que votre prédicat n'autorisera jamais le retour de lignes nulles. Habituellement, c'est le cas en raison de la sémantique SQL NULL (semmingly le seul cas où ils aident au lieu de gêner). Exemple: select distinct col from T n'utilisera pas l'index car une valeur nulle pourrait être trouvée. Utilisez ceci: select distinct col from T where col is not null.

Les index filtrés sont largement sous-utilisés. Ils peuvent même être utilisés pour rendre une colonne nullable unique.

Ma recommandation pratique: Essayez-le pendant quelques mois et apprenez par vous-même s'il y a d'autres problèmes imprévus.

Si vous utilisez des techniques de requête SQL Server avancées, regardez également les affichages indexés. Ils constituent un super ensemble d'index filtrés (au moins sur Enterprise).

+1

+1 pour une réponse claire, et un indice distinct et nul! –

0

Tous les indices ont des avantages et des inconvénients: Inconvénients:

  1. ils prennent l'espace disque
  2. ils doivent être maintenus (l'équilibre de l'arbre d'index doit être reorgansised périodiquement pour assurer que toutes les l'optimisation des requêtes n'utilise pas la distribution des données de bum) qui peut signifier qu'ils doivent être retirés de la ligne - mauvaises nouvelles s'ils sont occupés
  3. ils ont besoin de temps pour mettre à jour à la volée s'il y a des insertions fréquentes

Avantages:

  1. bien conçus, ils peuvent éliminer les scans de tables coûteuses
  2. correctement conçu, (un indice de couverture), ils peuvent elimiate une table de lecture.

Donc comme d'habitude cela dépend.

  1. trop d'index peuvent ralentir considérablement écrire performanace
  2. trop d'index peut considérablement augmenter l'utilisation de dispace
  3. pas l'index droit peut considérablement diminuer par les performances de lecture

Certaines personnes font vivre très bon de connaître vraiment leurs trucs sur les index: Il y a immensément de bonnes choses ici http://www.insidesqlserver.com/

Cela dépend donc de la fréquence à laquelle les utilisateurs renvoient des données référencées par l'index par rapport à la fréquence à laquelle ils mettent à jour les données contenues via l'index.

Les index pour les colonnes éparses ne sont pas différents, mais lorsque la colonne est (en grande partie) vide, les index filtrés sont plus efficaces. Une fois que l'épargne diminue (par exemple 50/50), la distribution des données peut devenir très importante lorsque l'optimiseur décide du meilleur plan pour retourner les données.Un index filtré ne connaîtra pas la distribution des données en dehors du filtre - c'est un peu évident mais cela doit être dit.

+2

Je pense que vous avez manqué le point de la question. Ce n'est pas sur les index en général, c'est sur les filtres sur les index. Cela enlève votre désavantage de prendre de l'espace disque etc. –

+0

Désolé, j'essayais de faire valoir que lorsqu'on considère généralement avoir un index, les considérations générales commencent au même endroit. Densité des données, lectures vs écriture etc. Le résultat devrait être index/pas d'index et si index puis type d'index. Vous pouvez également utiliser l'index manquant/inutilisé stocké procs pour optimiser les performances au fil du temps et la distribution des données change. Un index filtré occupe plus d'espace qu'aucun index, moins d'espace qu'un index non filtré. Ne pas essayer de commencer une guerre! –

+0

Donc maintenant pour ma question: Vous dites "où la colonne est largement vide, puis les index filtrés sont plus efficaces" -> Pourquoi ne pas mettre un filtre sur un index pour une colonne qui est seulement vide pour 5%, ou même comme 1%? (Cela peut toujours représenter 500 000 lignes, ce qui économise du stockage.) –

Questions connexes