J'aurais pensé que les bases de données en sauraient assez sur ce qu'elles rencontrent souvent et seraient en mesure de répondre aux demandes auxquelles elles sont soumises pour décider d'ajouter des index aux données hautement sollicitées.
32
UNIQUE
contraintes.Réponses:
Mise à jour
Ceci est maintenant implémenté dans SQL Server Azure. Il génère des recommandations
et la gestion des index peut être configurée pour être automatique .
Réponse originale
Certaines bases de données créent déjà (en quelque sorte) des index automatiquement.
Dans SQL Server, le plan d'exécution peut parfois inclure un opérateur de spool d'index dans lequel le SGBDR crée dynamiquement une copie indexée des données. Cependant, ce spool n'est pas une partie persistante de la base de données maintenue synchronisée avec les données source et ne peut pas être partagé entre les exécutions de requêtes, ce qui signifie que l'exécution de tels plans peut aboutir à la création et à la suppression répétées d'index temporaires sur les mêmes données.
Peut-être qu'à l'avenir, les SGBDR auront la capacité de supprimer et de créer dynamiquement des index persistants en fonction de la charge de travail.
Le processus d’optimisation des indices n’est finalement qu’une analyse coûts-avantages. S'il est vrai que les utilisateurs peuvent avoir davantage d'informations sur l'importance relative des requêtes dans une charge de travail, il n'y a en principe aucune raison pour que ces informations ne puissent pas être mises à la disposition de l'optimiseur. SQL Server dispose déjà d'un gouverneur de ressources permettant de classer les sessions en différents groupes de charges de travail avec différentes allocations de ressources, en fonction de leur priorité.
Les DMV d'index manquants mentionnés par Kenneth ne sont pas conçus pour être implémentés à l'aveugle, car ils ne considèrent que les avantages d'une requête spécifique et ne tentent pas de prendre en compte le coût de l'index potentiel par rapport à d'autres requêtes. Il ne consolide pas non plus les index manquants similaires. par exemple, la sortie de ce fichier DMV peut signaler des index manquants sur
A,B,C
etA,B INCLUDE(C)
Certains problèmes actuels avec l'idée sont
Il est probablement raisonnable de s'attendre à ce que la précision des modèles d'établissement des coûts s'améliore avec le temps, mais le point 2 semble plus difficile à résoudre et le point 3 est intrinsèquement insoluble.
Néanmoins, la grande majorité des installations ne sont probablement pas dans cette situation idéalisée avec un personnel qualifié qui surveille, diagnostique et anticipe en permanence (ou du moins réagit aux) changements de charge de travail.
Le projet AutoAdmin de Microsoft Research est en cours depuis 1996
La page d'accueil du projet répertorie plusieurs projets intrigants. L'une est particulièrement pertinente pour la question ici
Les auteurs déclarent
Le papier introduit un algorithme
L'implémentation de l'algorithme permet une limitation en réponse aux modifications de la charge du serveur et peut également interrompre la création d'index si, au cours de la création, les modifications de charge de travail et les avantages attendus deviennent inférieurs au seuil jugé intéressant.
La conclusion des auteurs sur le thème de l' optimisation physique en ligne versus traditionnelle.
Les conclusions ici sont similaires à celles d'un autre article . Réglage d'index piloté par une requête autonome
la source
La conception de l’indice que vous avez mise en place relève plus de l’art que de la science. Le SGBDR n'est pas assez intelligent pour prendre des charges de travail communes et concevoir une stratégie d'indexation intelligente. C’est à l’intervention humaine (lire: DBA) d’analyser la charge de travail et de déterminer quelle est la meilleure approche.
S'il n'y avait aucune pénalité d'avoir des index, alors ce serait une approche simpliste d'ajouter simplement un nombre infini d'index. Mais étant donné que la modification des données (INSERTS, UPDATES et DELETES) a un impact sur les index activés sur une table, il va y avoir un surcoût variable de ces index.
Il faut une conception et une stratégie humaines pour créer intelligemment des index qui optimisent les performances de lecture, tout en minimisant les coûts de modification des données.
la source
En fait, certaines bases de données le font. Par exemple, BigTable de Google et SimpleDB d'Amazon créent automatiquement des index (même s'ils ne font pas partie du SGBDR) . Il existe également au moins un moteur de SGBDR MySQL qui effectue cela. SQL Server conserve également une trace des index qu'il pense que vous devriez créer , bien que cela ne va pas jusqu'à les créer.
Le problème est étonnamment difficile à résoudre. Il n’est donc pas étonnant que la plupart des bases de données ne les créent pas automatiquement (BigTable / SimpleDB s’en écarte car elles ne permettent pas les jointures arbitraires, ce qui facilite considérablement les choses) . De plus, créer des index à la volée est un processus fastidieux qui nécessite un accès exclusif à l'ensemble de la table - ce n'est certainement pas quelque chose que vous souhaitez voir se produire lorsque la table est en ligne.
Cependant, étant donné le nombre d'applications web LAMP là - bas qui ont été écrits par des amateurs qui ne savent même pas ce qu'est un indice est , je pense toujours que cette fonction serait bénéfique pour certaines personnes.
la source
rdbms
et je ne pense pas que BigTable tombe dans la catégorie.Bien qu'il existe déjà de nombreuses réponses, elles semblent passer à côté de la vraie réponse: les index ne sont pas toujours souhaitables.
Avec l'analogie voiture mentionnée dans les commentaires, vous feriez mieux de dire pourquoi toutes les voitures ne sont pas équipées de forfaits sports extrêmes? C'est en partie une dépense, mais c'est aussi dû au fait que beaucoup de gens n'ont pas besoin ou ne veulent pas de pneus à profil bas et d'une suspension très dure; c'est inutilement inconfortable.
Alors peut-être que vous avez 1 000 lectures pour chaque insertion, pourquoi ne pas avoir un index créé automatiquement? Si la table est large et que les requêtes sont variées, pourquoi ne pas en avoir plusieurs? Peut-être que le commit est critique pour le temps et que les lectures ne le sont pas; dans les circonstances, il pourrait être inacceptable de ralentir votre insertion. Vous travaillez peut-être avec un espace disque limité et vous ne pouvez pas vous permettre d'avoir des index supplémentaires qui grignotent l'espace que vous avez.
Le fait est que les index ne sont pas créés automatiquement car ils ne sont pas la solution à tout. Concevoir des index ne consiste pas simplement à dire "hé ça accélérera mes lectures", il faut tenir compte d'autres facteurs.
la source
Ils peuvent analyser les requêtes passées et suggérer / créer des index, mais cela ne fonctionne pas de manière optimale, car les index permettent d’obtenir un résultat optimisé à un coût et le serveur ne peut pas connaître vos intentions.
la source
Ils ne sont pas intelligents, ils sont un morceau de code. Chaque fois que vous entrez de nouvelles données dans une base de données, celle-ci doit trouver un nouvel emplacement et une carte pour la retrouver à la demande. L'indexation des sons est plus facile que vous ne le faites, vous venez de donner un nouveau numéro à un nouveau bloc de données? Bien, que diriez-vous si la requête suivante ne concerne pas le dernier bloc de données mais environ 36271 tronçons plus tôt? Vous pouvez facilement le trouver avec votre index, non? Mais que se passe-t-il si la requête inclut un mot comme "pêche" qui se trouve dans l’ancien bloc 36271 fabriqué en 1997? Ho? Pas un mot sur la pêche dans le vieil article.
Si les données arrivaient une à une dans la base de données, elles pourraient être indexées de cette façon. Mais une indexation simple vous fera perdre de bons résultats et / ou ralentira vos performances tôt ou tard ...
la source