Pourquoi les bases de données ne créent-elles pas leurs propres index automatiquement?

32

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.

Jharwood
la source
3
Votre voiture répare-t-elle automatiquement son propre pneu crevé?
Kermit
11
Une analogie plus précise est celle-ci: votre calculateur modifie-t-il la puissance fournie à la pompe à carburant pour fixer les débits de carburant / huile et compenser les conduites encrassées? à laquelle la réponse est oui ..
Jharwood
11
Une base de données peut déjà placer un index sur une table qu’elle exige actuellement de commander, une voiture ne peut physiquement remplacer un pneu, tant que nous n’avons pas construit des armes à utiliser.
Jharwood
1
Ils le font - pour les colonnes qui ont des UNIQUEcontraintes.
dan04
8
Si vous recherchez des "bases de données à réglage automatique" sur Google, vous trouverez de nombreuses recherches à ce sujet. Peut-être qu’à l’avenir il sera courant d’avoir un élément de ce genre.
Martin Smith

Réponses:

25

Mise à jour

Ceci est maintenant implémenté dans SQL Server Azure. Il génère des recommandations

entrez la description de l'image ici

et la gestion des index peut être configurée pour être automatique .

Activer la gestion automatique des index

Vous pouvez configurer le Conseiller de base de données SQL pour qu'il implémente les recommandations automatiquement. Au fur et à mesure que les recommandations deviennent disponibles, elles seront automatiquement appliquées. Comme pour toutes les opérations d'index gérées par le service, si l'impact sur les performances est négatif, la recommandation est annulée.

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,CetA,B INCLUDE(C)

Certains problèmes actuels avec l'idée sont

  • La qualité de toute analyse automatisée qui ne crée pas réellement l'indice dépendra beaucoup de la précision du modèle de calcul des coûts.
  • Même dans le domaine de l'analyse automatisée, une solution hors ligne pourra être plus complète qu'une solution en ligne, car il est impératif qu'une solution en ligne n'augmente pas les frais de gestion de la comptabilité pour le serveur actif et interfère avec son objectif principal d'exécution de requêtes.
  • Les index créés automatiquement en réponse à une charge de travail seront nécessairement créés en réponse à des requêtes qui les auraient trouvées utiles, de sorte qu'ils seront en retard sur les solutions qui créent les index à l'avance.

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

Le but de ce projet est de rendre les bases de données auto-ajustables et auto-administrables en exploitant la connaissance de la charge de travail

La page d'accueil du projet répertorie plusieurs projets intrigants. L'une est particulièrement pertinente pour la question ici

Un autre problème intéressant se pose lorsqu'il n'y a pas de DBA disponible (par exemple, une base de données intégrée ou une petite entreprise). Dans de tels scénarios, une approche de réglage continu de l’indice sans contact peut devenir importante. Nous avons exploré des solutions ... [en] “ Une approche en ligne du réglage de la conception physique ” dans ICDE 2007.

Les auteurs déclarent

Avec des fonctionnalités de SGBD de plus en plus courantes telles que les index en ligne, il est intéressant d’explorer des solutions plus automatiques au problème de conception physique qui fait progresser l’état de la technique.

Le papier introduit un algorithme

Ses principales caractéristiques sont:

  • Au fur et à mesure que les requêtes sont optimisées, nous identifions un ensemble pertinent d'index candidats susceptibles d'améliorer les performances. Cette fonctionnalité permet au traitement des requêtes de continuer en parallèle avec les index construits en arrière-plan.
  • Au moment de l'exécution, nous suivons les avantages potentiels que nous perdons en ne disposant pas de tels index candidats, ainsi que l'utilité des index existants en présence de requêtes, de mises à jour et de contraintes d'espace.
  • Une fois que nous avons rassemblé suffisamment de «preuves» selon lesquelles une modification de la conception physique est bénéfique, nous déclenchons automatiquement la création ou la suppression d'index.
  • La nature en ligne de notre problème implique que nous allons généralement prendre du retard par rapport aux solutions optimales qui connaissent l'avenir. Cependant, en mesurant avec soin les éléments de preuve, nous nous assurons de ne pas souffrir de décisions «tardives», ce qui limite le montant des pertes subies.

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 algorithmes en ligne utilisés dans ce travail sont utiles lorsque les administrateurs de base de données ont des doutes sur le comportement futur de la charge de travail ou n'ont aucune possibilité d'effectuer une analyse ou une modélisation complète. Si un administrateur de base de données dispose de toutes les informations sur les caractéristiques de la charge de travail, une analyse statique et le déploiement à l'aide d'outils existants (par exemple, [2, 3]) constitueraient une meilleure alternative.

Les conclusions ici sont similaires à celles d'un autre article . Réglage d'index piloté par une requête autonome

Notre approche ne peut pas battre le conseiller indiciel si l’ensemble de la charge de travail est connue à l’avance. Toutefois, dans les environnements dynamiques où les charges de travail évoluent et changent, l'approche basée sur les requêtes produit de meilleurs résultats.

Martin Smith
la source
4
Il est extrêmement dangereux pour une carrière de DBA d'assumer que ses compétences ne peuvent jamais être automatisées. Cela tue les carrières des gars du réseau en ce moment, car le changement est opéré vers des centres de données définis par logiciel. En tant que bons administrateurs de base de données, nous devrions diriger les efforts d'automatisation.
Gaius
20

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.

Thomas Stringer
la source
Les commentaires ne sont pas pour une discussion prolongée; cette conversation a été déplacée pour discuter .
Paul White a déclaré GoFundMonica
13

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.

BlueRaja - Danny Pflughoeft
la source
4
Je dirais que comparer BigTable (et ses dérivés, tels que Cassandra, HBase, etc.) à des solutions de SGBDR, c'est comparer des pommes à des oranges - BigTable et ses dérivés ressemblent davantage à de gigantesques clés à valeur ou à magasins en colonnes, et la clé de ligne est par nature un index .
Suman
1
Exactement. La question est étiquetée avec rdbmset je ne pense pas que BigTable tombe dans la catégorie.
Ypercubeᵀᴹ
2
@ypercube: ... Oui, j'ai mentionné cela dans ma réponse; mais il est toujours intéressant de savoir, au moins comme un point d'intérêt. J'ai également mentionné plusieurs bases de données qui sont du SGBDR et expliquons pourquoi ce n'est pas courant. Ce n'est certainement pas digne d'un
vote négatif
1
Je n'ai pas voté. Je conviens que c'est un problème très difficile.
Ypercubeᵀᴹ
10

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.

Mat
la source
1
Bien qu'il soit certainement possible et faisable d'automatiser ce genre de choses, nous ne ferons pas toujours mieux avec un ensemble d'indices magiques implémentés par un système qui n'a aucune idée de la manière dont les données seront utilisées demain, peu importe votre écriture. vs lire le seuil de compromis. J'ai un peu blogué à ce sujet l'autre jour , mais il est clair qu'il y a encore beaucoup à dire.
Aaron Bertrand
> Peut-être que le commit est critique en termes de temps et que les lectures ne le sont pas; dans les circonstances, il pourrait être inacceptable de ralentir votre insertion. Une telle bonne réponse, très utile.
Siddhartha
6

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.

JamesRyan
la source
-4

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 ...

Niko Kiiskinen
la source