Question

Quelles sont les méthodes d'identification des colonnes superflues dans la couverture des indices: colonnes qui ne sont jamais contre recherchés, et peuvent donc être extraits en comprend, voire complètement supprimées sans affecter l'applicabilité de l'indice

Était-ce utile?

La solution

Pour clarifier les choses
L'idée de un indice de couverture est qu'il comprend également des colonnes qui ne peuvent être recherchées par (utilisée dans la clause WHERE et tel), mais peut être sélectionné (partie du SELECT colonnes liste).

Il ne semble pas être un moyen facile d'affirmer l'existence de colums inutilisés dans un indice de couverture . Je ne peux penser à un processus minutieux ci-dessous:

  • Pour une période représentative, enregistrer toutes les requêtes en cours d'exécution sur le serveur (ou sur la table souhaitée)
  • Filtre out (à travers l'expression régulière) requêtes il ne comportant pas la table sous-jacente
  • Pour les requêtes restantes, obtenir le plan de requête; rejeter les requêtes ne comportant pas l'indice en question
  • Pour les requêtes restantes, ou plutôt pour chaque « modèle » de requête (de nombreuses requêtes sont les mêmes, mais pour les valeurs des critères de recherche), faire la liste des colonnes de l'index qui sont soit en sélection ou clause where (ou REJOIGNEZ ...)
  • les colonnes de l'index ne figurent pas dans cette liste sont positivement à partir.

Maintenant, il peut y avoir quelques [colonnes pour enlever] parce que le processus ne vérifie pas ci-dessus dans quel contexte l'indice de recouvrement est utilisé (il est possible qu'il soit utilisé pour résoudre le où, mais que la table sous-jacente est toujours accessible aussi bien (par exemple pour se rendre à colonnes pas dans l'index de couverture ...)

L'approche clinique ci-dessus est assez peu attrayante. Une approche analytique peut être préférable :

Trouver toutes les requêtes « modèles » qui peuvent être utilisés dans toutes les applications utilisant le serveur. Pour chacun de ces modèles, trouver ceux qui pourraient utiliser l'indice de couverture. Ce sont (encore quelques trous ...) requêtes:

  • inclure une référence à la table sous-jacente
  • ne citent en aucune façon une colonne de la table sous-jacente qui n'est pas une colonne dans l'index
  • ne pas utiliser un critère de recherche de la table sous-jacente qui est plus sélectif que les colonnes de l'index (dans leur ordre très ...)

Ou ... sans même aller aux applications: penser à tous les cas d'utilisation , et si les requêtes qui serviraient ces cas bénéficieraient de pas de toutes les colonnes de l'index. Cela impliquerait que vous avez une assez bonne idée de la sélectivité de l'indice, en ce qui concerne ses premières colonnes.

Autres conseils

Si vous faites vos vérifications de cas d'utilisation et des points de données, de toute évidence tout ce qui est utilisé ou pris dans l'audit est un candidat pour la suppression. Si la base de données ne dispose pas d'une telle vérification approfondie, vous pouvez enregistrer la valeur d'une fenêtre temporelle de requêtes qui ont frappé la base de données en exécutant une trace et l'enregistrer. Vous pouvez analyser la trace et voir quel type de requêtes arrivent sur la base de données et à partir de là Intuit les colonnes peuvent être déposés.

L'analyse des traces est généralement utilisé pour trouver des candidats pour manquant indices, mais je devine qu'il pourrait également être utilisé pour analyser les tendances d'utilisation.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top