108 votes

Index de base de données combien est trop ?

Je suis en train de travailler sur un projet avec une assez grande base de données Oracle (bien que ma question s'applique aussi bien à d'autres bases de données). Nous avons une interface web qui permet aux utilisateurs de rechercher sur presque toutes les combinaisons possibles de champs.

Pour faire ces recherches vont vite, nous sommes d'ajouter des index sur les champs et les combinaisons de domaines dans lesquels nous croyons que les utilisateurs seront fréquemment de recherche. Cependant, puisque nous ne savons pas vraiment comment nos clients utilisent ce logiciel, il est difficile de dire qui de créer des index.

L'espace n'est pas un sujet de préoccupation; nous avons un 4 to disque dur RAID de qui nous sommes en utilisant seulement une petite fraction. Cependant, je suis inquiet au sujet de la possible dégradation des performances de l'avoir trop d'index. Parce que ces indices doivent être mis à jour chaque fois qu'une ligne est ajouté, supprimé ou modifié, j'imagine que ce serait une mauvaise idée d'avoir des dizaines d'index sur une seule table.

Alors, comment beaucoup d'index est considéré comme trop nombreux? 10? 25? 50? Ou devrais-je viens de couverture de vraiment de, vraiment de la commune et des cas évidents et ignorer tout le reste?

85voto

cagcowboy Points 13721

Il repose sur les activités qui se produisent sur la table.

Si il y a beaucoup de Sélectionne et très peu de changements, l'indice de tout ce que vous voulez.... ils seront (peut-être) vitesse les instructions SELECT.

Si la table est fortement touchés par les Mises à jour, des INSERTs + Supprime ... ce sera très lent, avec beaucoup d'indices, car ils ont tous besoin d'être modifié chaque fois que l'un de ces opérations a lieu

Cela dit, vous pouvez facilement ajouter beaucoup de inutile d'index à une table qui ne font rien. L'ajout de B-Arbre d'index à une colonne avec 2 valeurs distinctes sera inutile car il ne veut pas ajouter quoi que ce soit en termes de recherche les données. La plus unique de valeurs dans une colonne, plus il bénéficiera d'un index.

43voto

Sklivvz Points 16412

J'ai l'habitude de procéder comme cela.

  1. Obtenez un journal du réel les requêtes exécutées sur les données sur une journée typique.
  2. Ajouter l'index donc, le plus important des requêtes de frapper les indices dans leur plan d'exécution.
  3. Essayez d'éviter l'indexation de champs qui ont beaucoup de mises à jour ou des inserts
  4. Après quelques indices, obtenir un nouveau journal et répétez.

Comme avec tous les tout de l'optimisation, je m'arrête quand la performance demandé est atteint (ce qui implique évidemment le point 0. serait exigences spécifiques de performance).

26voto

Mike McAllister Points 871

Tout le monde a été de vous donner de bons conseils. J'ai ajouté une suggestion pour vous que vous aller de l'avant. À un certain moment, vous avez à prendre une décision quant à votre meilleure indexation de la stratégie. Au final, cependant, la meilleure PRÉVU d'indexation stratégie peut encore créer des indices qui n'en finissent pas de s'habituer. Une stratégie qui vous permet de trouver les indices qui ne sont pas utilisées est de surveiller l'utilisation des index. Pour cela, procédez comme suit:-

alter index my_index_name monitoring usage;

Vous pouvez ensuite contrôler si l'index est utilisé ou non à partir de ce moment, en interrogeant v$object_usage. Les informations sur ce qui peut être trouvé dans la Base de données Oracle® Guide de l'Administrateur.

Souvenez-vous que si vous avez un entreposage la stratégie de supprimer les index avant de mettre à jour une table, puis de recréer eux, vous devez définir l'index pour la surveillance de nouveau, et vous perdrez tout le suivi de l'historique d'index.

14voto

David Aldridge Points 27624

Dans un entrepôt de données, il est très fréquent d'avoir un nombre élevé d'index. J'ai travaillé avec des tables de faits ayant deux cents colonnes et 190 indexés.

Bien qu'il existe une surcharge pour cela, il doit être compris dans le contexte que dans un entrepôt de données nous ne nous insérer une ligne une fois, nous n'avons jamais de mise à jour, mais il peut alors participer à des milliers de SÉLECTIONNER les requêtes qui pourraient bénéficier de l'indexation sur l'une des colonnes.

Pour un maximum de flexibilité d'un entrepôt de données, on utilise généralement une seule colonne bitmap index, sauf sur le haut de la cardinalité des colonnes, où (compressé) arbre d'index peuvent être utilisés.

La surcharge sur la maintenance des index est principalement associée avec les frais de rédaction d'un grand nombre de blocs et le bloc se divise comme de nouvelles lignes sont ajoutées avec les valeurs qui sont "au milieu" de l'existant gammes de valeur pour cette colonne. Cet effet peut être atténué par le partitionnement et le fait que le nouveau chargements de données aligné avec le schéma de partitionnement, et en utilisant directement le chemin des inserts.

Pour répondre à votre question plus directement, je pense que c'est probablement pas un problème pour l'index de l'évidente au premier abord, mais n'ayez pas peur d'ajouter plus d'indices sur si les requêtes contre la table en profiteraient.

12voto

Josef Points 4395

Dans une paraphrase d' Einstein sur la simplicité, ajouter autant d'index que vous avez besoin et rien de plus.

Sérieusement, cependant, chaque indice vous ajoutez nécessite un entretien chaque fois que des données sont ajoutées à la table. Sur les tables qui sont essentiellement en lecture seule, beaucoup d'indices sont une bonne chose. Sur les tables qui sont très dynamiques, de moins en moins, c'est mieux.

Mon conseil est de couvrir les communes et les cas évidents, et si vous rencontrez des problèmes lorsque vous avez besoin de plus de rapidité dans l'obtention des données de tables spécifiques, de les évaluer et d'ajouter des indices à ce point.

Aussi, c'est une bonne idée de ré-évaluer vos schémas d'indexation tous les quelques mois, juste pour voir si il y a quelque chose de nouveau qui a besoin de l'indexation ou de tous les indices que vous avez créé qui ne sont pas utilisées pour quoi que ce soit et doit être éliminé.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X