Ich hätte gedacht, dass Datenbanken genug über das wissen, worauf sie häufig stoßen, und in der Lage sein würden, auf die Anforderungen zu reagieren, unter denen sie gestellt werden, und dass sie entscheiden könnten, Indizes zu stark angeforderten Daten hinzuzufügen.
32
UNIQUE
Einschränkungen.Antworten:
Aktualisieren
Dies ist jetzt in SQL Server Azure implementiert. Es werden Empfehlungen generiert
Die Indexverwaltung kann so konfiguriert werden, dass sie automatisch erfolgt .
Ursprüngliche Antwort
Einige Datenbanken erstellen bereits Indizes automatisch.
In SQL Server kann der Ausführungsplan manchmal einen Indexspool- Operator enthalten, bei dem das RDBMS dynamisch eine indizierte Kopie der Daten erstellt. Dieser Spool ist jedoch kein beständiger Teil der Datenbank, der mit den Quelldaten synchron gehalten wird, und er kann nicht zwischen Abfrageausführungen geteilt werden, was bedeutet, dass die Ausführung solcher Pläne dazu führen kann, dass temporäre Indizes für dieselben Daten wiederholt erstellt und gelöscht werden.
Vielleicht werden RDBMS in Zukunft in der Lage sein, persistente Indizes je nach Arbeitslast dynamisch zu löschen und zu erstellen.
Der Prozess der Indexoptimierung ist letztendlich nur eine Kosten-Nutzen-Analyse. Es ist zwar richtig, dass Menschen im Prinzip mehr Informationen über die relative Bedeutung von Abfragen in einer Arbeitslast haben, aber es gibt keinen Grund, warum diese Informationen dem Optimierer nicht zur Verfügung gestellt werden könnten. SQL Server verfügt bereits über einen Ressourcen-Governor, mit dem Sitzungen je nach Priorität in verschiedene Workload-Gruppen mit unterschiedlichen Ressourcenzuordnungen eingeteilt werden können.
Die von Kenneth erwähnten fehlenden Index-DMVs sollen nicht blind implementiert werden, da sie nur die Vorteile einer bestimmten Abfrage berücksichtigen und nicht versuchen, die Kosten des potenziellen Index für andere Abfragen zu berücksichtigen. Es werden auch keine ähnlich fehlenden Indizes konsolidiert. ZB kann die Ausgabe dieser DMV fehlende Indizes auf
A,B,C
und meldenA,B INCLUDE(C)
Einige aktuelle Probleme mit der Idee sind
Es ist wahrscheinlich zu erwarten, dass sich die Genauigkeit von Kalkulationsmodellen mit der Zeit verbessert, aber Punkt 2 scheint schwieriger zu lösen und Punkt 3 ist von Natur aus unlösbar.
Trotzdem befindet sich wahrscheinlich die überwiegende Mehrheit der Installationen nicht in dieser idealen Situation mit qualifiziertem Personal, das Änderungen der Arbeitsbelastung kontinuierlich überwacht, diagnostiziert und antizipiert (oder zumindest darauf reagiert).
Das AutoAdmin-Projekt bei Microsoft Research läuft seit 1996
Die Projekthomepage listet mehrere interessante Projekte auf. Einer ist hier besonders relevant für die Frage
Die Autoren geben an
Die Arbeit stellt einen Algorithmus vor
Die Implementierung des Algorithmus ermöglicht eine Drosselung als Reaktion auf Änderungen der Serverauslastung und kann auch die Indexerstellung abbrechen, wenn während der Erstellung die Auslastungsänderungen und der erwartete Nutzen unter den Wert fallen, der als sinnvoll erachtet wird.
Das Fazit der Autoren zum Thema Online versus traditionelles Physical Tuning.
Die Schlussfolgerungen hier ähneln denen in einem anderen Artikel Autonomous Query-driven Index Tuning
quelle
Das von Ihnen eingerichtete Indexdesign ist eher eine Kunst als eine Wissenschaft. Das RDBMS ist nicht intelligent genug, um allgemeine Arbeitslasten zu verarbeiten und eine Strategie für die intelligente Indizierung zu entwerfen. Es ist Aufgabe des Menschen (sprich: DBA), die Arbeitsbelastung zu analysieren und den besten Ansatz zu ermitteln.
Wenn es keine Strafe dafür gibt, Indizes zu haben, wäre es eine Schrotflinte, einfach eine unendliche Anzahl von Indizes hinzuzufügen. Da sich Datenänderungen (INSERTS, UPDATES und DELETES) jedoch auf die aktivierten Indizes einer Tabelle auswirken, entsteht dieser variable Overhead für diese Indizes.
Die intelligente Erstellung von Indizes, die die Leseleistung maximieren und gleichzeitig den geringsten Datenänderungsaufwand verursachen, erfordert menschliches Design und Strategie.
quelle
In der Tat gibt es einige Datenbanken, die dies tun. Zum Beispiel erstellen Googles BigTable und Amazons SimpleDB automatisch Indizes (obwohl dies auch keine RDBMS sind) . Es gibt auch mindestens eine MySQL-RDBMS-Engine , die dies tut. SQL Server verfolgt auch die Indizes, die Sie Ihrer Meinung nach erstellen sollten , obwohl es nicht so weit geht, sie tatsächlich zu erstellen.
Das Problem ist überraschend schwer zu beheben, daher ist es kein Wunder, dass die meisten Datenbanken sie nicht automatisch erstellen (BigTable / SimpleDB kommen damit davon, weil sie keine willkürlichen Verknüpfungen zulassen, was die Dinge erheblich vereinfacht) . Darüber hinaus ist das Erstellen von Indizes im laufenden Betrieb ein zeitaufwändiger Prozess, bei dem ausschließlich auf die gesamte Tabelle zugegriffen werden muss. Dies ist definitiv nicht erwünscht, wenn die Tabelle online ist.
Angesichts der Anzahl der LAMP-Webanwendungen, die von Amateuren geschrieben wurden, die nicht einmal wissen, was ein Index ist , denke ich, dass diese Funktion für einige Leute von Vorteil ist.
quelle
rdbms
und ich glaube nicht, dass BigTable in die Kategorie fällt.Obwohl es bereits einige ausführliche Antworten gibt, scheinen sie die eigentliche Antwort zu umgehen : Indizes sind nicht immer wünschenswert.
In Anbetracht der in den Kommentaren erwähnten Autoanalogie können Sie besser sagen, warum nicht alle Autos mit Extremsportpaketen ausgestattet sind. Teilweise sind es Kosten, aber es liegt auch an der Tatsache, dass viele Leute keine Reifen mit niedrigem Profil und steinharte Federung brauchen oder wollen. es ist unnötig unangenehm.
Vielleicht haben Sie 1.000 Lesevorgänge für jede Beilage. Warum nicht einen automatisch erstellten Index? Wenn die Tabelle breit ist und die Abfragen unterschiedlich sind, warum nicht mehrere? Möglicherweise ist das Festschreiben zeitkritisch und die Lesevorgänge nicht; Unter diesen Umständen ist es möglicherweise nicht akzeptabel, den Einsatz zu verlangsamen. Möglicherweise arbeiten Sie mit begrenztem Speicherplatz und können es sich nicht leisten, zusätzliche Indizes in den verfügbaren Speicherplatz zu laden.
Der Punkt ist, dass Indizes nicht automatisch erstellt werden, weil sie nicht die Antwort auf alles sind. Das Entwerfen von Indizes bedeutet nicht nur "Hey, das beschleunigt meine Lesevorgänge", sondern es sind auch andere Faktoren zu berücksichtigen.
quelle
Sie können getätigte Abfragen analysieren und deuten darauf hin , / erstellen Indizes jedoch nicht optimal funktioniert , weil Indizes ein Gleichgewicht zu beschleunigen , was Sie optimiert werden soll zu einem Preis und der Server kann Ihre Absichten nicht kennen.
quelle
Sie sind nicht schlau, sie sind ein Stück Code. Jedes Mal, wenn Sie neue Daten in eine Datenbank eingeben, muss diese einen neuen Speicherort und eine Karte finden, um sie zu finden, wenn sie angefordert wird. Das Indizieren klingt einfacher als es ist. Sie geben einem neuen Datenblock einfach eine neue Nummer? Wie wäre es, wenn sich die nächste Abfrage nicht auf den letzten Datenblock bezieht, sondern auf 36271 Datenblöcke früher? Sie können es leicht mit Ihrem Index finden, oder? Aber was ist, wenn die Abfrage ein Wort wie "Angeln" enthält, das in dem alten, 1997 erstellten Stück 36271 zu finden ist? Ho? Kein Wort zum Angeln im alten Artikel.
Wenn Daten nacheinander in die Datenbank gelangen, können sie auf diese Weise indiziert werden. Aber eine einfache Indizierung führt früher oder später zu falschen Ergebnissen und / oder einer schlechten Leistung ...
quelle