Comment déterminer si un indice est nécessaire ou nécessaire - Base de données Administrateurs Stack échange

Je dirige un outil d'auto-index sur notre base de données MS SQL (j'ai modifié un script provenant de Microsoft qui se penche sur les tableaux de statistiques d'index - indexation automatique automatique). D'après les statistiques, j'ai maintenant une liste de recommandations pour les index qui ont besoin de créer.

Edit: Les indices décrits ci-dessus prennent des informations de ce DMV que vous dire ce que le moteur de base de données utiliserait pour les index si elles étaient disponibles et les scripts prennent les principales recommandations x (par cherche, l'impact utilisateur, etc.) et mettre ces derniers dans une table.

(Édition au-dessus partiellement pris de la réponse de Larry Coleman ci-dessous afin de clarifier ce que les scripts sont en train de faire)

Comme je suis nouveau à la base de données admin, et ayant eu une recherche rapide sur le net, je suis peu disposé à franchir le pas et ajouter aveuglément les indices recommandés. Cependant, ne pas être connu dans le domaine, je suis à la recherche de quelques conseils sur la façon de déterminer si les recommandations sont nécessaires ou non.

Ai-je besoin d'exécuter le Générateur de profils SQL, ou est-il préférable d'examiner le code qui interroge les tables? Et avez-vous d'autres conseils?

J'utilise les scripts d'analyse d'index de Jason Strate (emplacement Old). Ils vous disent combien vos index existants sont utilisés ainsi que la façon dont les indices beaucoup manquants auraient été utilisés. En général, je ne pas ajouter des index à moins qu'ils ne représentent plus que 5 ou 10% des requêtes sur une table.

Plus important encore, cependant, il est de faire que l'application répond assez rapide pour les utilisateurs.

Mise à jour Double: Ces jours-ci, j'utilise sp_BlitzIndex® lors de l'exécution d'analyse d'index.

Il y a quelques termes et concepts qui sont importants pour comprendre lorsqu'ils traitent avec des index. Seeks, les analyses et les recherches sont quelques-unes des façons dont les indices seront utilisés dans les instructions select. Sélectivité des colonnes de clé fait partie intégrante de déterminer comment un indice peut être efficace.

Une recherche se produit lorsque l'optimiseur de requêtes SQL Server détermine que la meilleure façon de trouver les données que vous avez est en balayant une plage dans un index. Vise se produisent généralement lorsqu'une requête est « couverte » par un indice, ce qui signifie que chercher prédicats sont la clé d'index et les colonnes affichées sont soit dans la clé ou inclus. Une analyse se produit lorsque l'optimiseur de requêtes SQL Server détermine que la meilleure façon de trouver les données à analyser toute l'index, puis filtrer les résultats. Une recherche se produit généralement lorsqu'un index ne comprend pas toutes les colonnes demandées, que ce soit dans la clé d'index ou dans les colonnes incluses. L'optimiseur de requête utilisera alors soit la clé en cluster (contre un index ordonné en clusters) ou le RID (contre un tas) pour « consultation » les autres colonnes demandées.

En règle générale, opérations de recherche sont plus efficaces que les analyses, en raison de l'interrogation physiquement un ensemble plus restreint de données. Il y a des situations où ce n'est pas le cas, comme un ensemble de données initial très faible, mais cela va au-delà de la portée de votre question.

Afin de déterminer comment un indice effectif est, vous devez déterminer la sélectivité de vos clés d'index. Sélectivité peut être défini comme un pourcentage de dossiers distincts aux dossiers totaux. Si j'ai une [personne] table avec 100 enregistrements au total et la colonne [prenom] contient 90 valeurs distinctes, on peut dire que la [prenom] colonne est de 90% sélective. Plus la sélectivité, la clé d'index plus efficace. En gardant à l'esprit la sélectivité, il est préférable de mettre vos colonnes les plus sélectives d'abord dans votre clé d'index. En utilisant ma précédente [personne] par exemple, que si nous avions un [last_name] colonne qui était sélective 95%? Nous voudrions créer un index avec [last_name], [prenom] comme la clé d'index.

Je sais que cela a été un peu longue réponse, mais il y a vraiment beaucoup de choses qui contribuent à déterminer un indice sera efficace, et une des choses beaucoup vous devez peser les gains de performance contre.

Cela fait une bonne analyse qui existent des indices, à quelle fréquence ils sont utilisés et à quelle fréquence le moteur de recherche est à la recherche d'un index qui n'existe pas.

Il est des conseils est généralement bonne. Parfois, il devient un peu trop suggestif d'idées. Je l'ai fait jusqu'à présent généralement les éléments suivants:

Je n'ai pas ajouté tous les indices recommandés, et suis retourné pas une semaine plus tard pour constater qu'ils sont plus recommandés depuis le moteur de recherche utilise certains des autres nouveaux index au lieu!

En général, vous devez éviter les index sur:

50% qui correspondent. Si elle est présente après quelque chose de plus spécifique dans l'indice (par exemple [date de naissance, le sexe]) qui est mieux - vous pouvez tous les hommes nés dans un laps de temps donné.

Les requêtes changent, les volumes de données changent, de nouvelles fonctionnalités sont ajoutées, anciens enlevés. Vous devriez regarder les une fois par mois (ou plus souvent si vous avez des volumes élevés) et la recherche d'où vous pouvez aider à la base de données!

Votre kilométrage varie selon la base de données. Couvrir l'évidence (le nom de l'employé, la date de commande, etc.) sur votre (maintenant / avenir) les grandes tables. Surveiller, réviser et ajuster si nécessaire. Il devrait faire partie de votre liste de contrôle de routine dans la gestion de votre base de données (s) :)

J'espère que cela t'aides!

Une bonne approche serait de trier les index manquants requête en nombre de cherche, et envisager d'ajouter les principaux indices en premier.

Cela dépend de la façon dont cette table est utilisée. par exemple. LETS dire que j'ai une table qui est lu beaucoup de temps, mais les mises à jour et inserts sont rares. De plus, je toujours interroger la table sur une colonne de clé étrangère. Il sera logique de créer l'index (non cluster) sur cette clé étrangère pour accélérer les requêtes de lecture. Mais l'inconvénient est, votre insertion, la mise à jour deviendra lente.

Il y a quelques requêtes statistiques qui indiquent comment les requêtes beaucoup de temps prennent. Commencez par les plus lents. Si le prédicat de la requête n'a pas d'index, ce qui crée un aidera.

Articles Liés