Warum erstellen Datenbanken ihre eigenen Indizes nicht automatisch?


32

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.


3
Repariert Ihr Auto automatisch seinen eigenen platten Reifen?
Kermit

11
Eine genauere Analogie besteht darin, dass Ihre ECU die an die Kraftstoffpumpe gelieferte Leistung ändert, um die Kraftstoff- / Öldurchflussraten festzulegen und verschmutzte Leitungen zu kompensieren.
Darauf

11
Eine Datenbank kann bereits einen Index für eine Tabelle erstellen, für die wir gerade den Befehl erteilen müssen. Ein Auto kann einen Reifen physisch nicht ersetzen, bis wir einige Waffen für ihn gebaut haben.
Jharwood

1
Sie tun dies - für Spalten mit UNIQUEEinschränkungen.
Dan04

8
Wenn Sie auf "Self-Tuning-Datenbanken" googeln, finden Sie zahlreiche Nachforschungen zu diesem Thema. Vielleicht wird es in Zukunft üblich sein, ein Element davon zu haben.
Martin Smith

Antworten:


25

Aktualisieren

Dies ist jetzt in SQL Server Azure implementiert. Es werden Empfehlungen generiert

Bildbeschreibung hier eingeben

Die Indexverwaltung kann so konfiguriert werden, dass sie automatisch erfolgt .

Aktivieren Sie die automatische Indexverwaltung

Sie können den SQL-Datenbankratgeber so einstellen, dass Empfehlungen automatisch implementiert werden. Sobald Empfehlungen verfügbar sind, werden sie automatisch angewendet. Wie bei allen Indexoperationen, die vom Service verwaltet werden, wird die Empfehlung zurückgesetzt, wenn die Auswirkungen auf die Leistung negativ sind.

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

Einige aktuelle Probleme mit der Idee sind

  • Die Qualität einer automatisierten Analyse, die den Index nicht tatsächlich erstellt, hängt in hohem Maße von der Genauigkeit des Kalkulationsmodells ab.
  • Selbst auf dem Gebiet der automatisierten Analyse kann eine Offline-Lösung gründlicher sein als eine Online-Lösung, da es unbedingt erforderlich ist, dass eine Online-Lösung den Live-Server nicht mit einem hohen Aufwand für die Buchhaltung belastet und den primären Zweck der Ausführung von Abfragen beeinträchtigt.
  • Die Indizes, die automatisch als Antwort auf die Arbeitslast erstellt werden, werden notwendigerweise als Antwort auf Abfragen erstellt, die sie als nützlich erachtet hätten, und bleiben daher hinter den Lösungen zurück, die die Indizes im Voraus erstellen.

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

Das Ziel dieses Projekts ist es, Datenbanken selbst zu optimieren und zu verwalten, indem das Wissen über die Arbeitslast genutzt wird

Die Projekthomepage listet mehrere interessante Projekte auf. Einer ist hier besonders relevant für die Frage

Ein weiteres interessantes Problem tritt auf, wenn kein DBA verfügbar ist (z. B. eine eingebettete Datenbank oder ein kleines Unternehmen). In solchen Szenarien kann ein kontinuierlicher Indexoptimierungsansatz mit geringer Berührung wichtig werden. Wir haben Lösungen untersucht ... [in] „ Ein Online-Ansatz zur Optimierung des physischen Designs “ in ICDE 2007.

Die Autoren geben an

Angesichts der zunehmend verbreiteten DBMS-Funktionen wie Online-Indizes ist es ansprechend, automatischere Lösungen für das Problem des physischen Designs zu suchen, die den Stand der Technik voranbringen.

Die Arbeit stellt einen Algorithmus vor

Seine Hauptmerkmale sind:

  • Bei der Optimierung von Abfragen identifizieren wir einen relevanten Satz von Kandidatenindizes, die die Leistung verbessern würden. Mit dieser Funktion kann die Abfrageverarbeitung parallel zu im Hintergrund erstellten Indizes fortgesetzt werden.
  • Zur Ausführungszeit verfolgen wir die potenziellen Vorteile, die uns durch das Nichtvorhandensein solcher Kandidatenindizes entgehen, sowie die Nützlichkeit vorhandener Indizes bei Vorhandensein von Abfragen, Aktualisierungen und Platzbeschränkungen.
  • Nachdem wir genügend „Beweise“ dafür gesammelt haben, dass eine physische Designänderung von Nutzen ist, lösen wir automatisch Indexerstellungen oder -löschungen aus.
  • Die Online-Natur unseres Problems impliziert, dass wir im Allgemeinen hinter den optimalen Lösungen zurückbleiben, die die Zukunft kennen. Indem wir die Beweise sorgfältig messen, stellen wir jedoch sicher, dass wir nicht wesentlich unter „verspäteten“ Entscheidungen leiden, wodurch die Höhe des entstandenen Schadens begrenzt wird

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 Online-Algorithmen in dieser Arbeit sind nützlich, wenn Datenbankadministratoren sich über das zukünftige Verhalten der Arbeitslast nicht sicher sind oder keine Möglichkeit haben, eine umfassende Analyse oder Modellierung durchzuführen. Wenn ein DBA über vollständige Informationen zu den Auslastungseigenschaften verfügt, ist eine statische Analyse und Bereitstellung durch vorhandene Tools (z. B. [2, 3]) eine bessere Alternative.

Die Schlussfolgerungen hier ähneln denen in einem anderen Artikel Autonomous Query-driven Index Tuning

Unser Ansatz kann den Indexberater nicht schlagen, wenn die gesamte Arbeitslast im Voraus bekannt ist. In dynamischen Umgebungen mit sich entwickelnden und sich ändernden Arbeitslasten führt der abfrageorientierte Ansatz jedoch zu besseren Ergebnissen.


4
Es ist unglaublich gefährlich für die Karriere eines DBAs, anzunehmen, dass seine Fähigkeiten niemals automatisiert werden können. Das tötet gerade die Karrieren der Netzwerk-Leute, da die Verlagerung auf softwaredefinierte Rechenzentren liegt. Als gute DBAs sollten wir den Automatisierungsaufwand leiten.
Gaius

20

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.


Kommentare sind nicht für längere Diskussionen gedacht. Diese Unterhaltung wurde in den Chat verschoben .
Paul White sagt GoFundMonica

13

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.


4
Ich würde sagen, dass der Vergleich von BigTable (und seinen Derivaten wie Cassandra, HBase usw.) mit RDBMS-Lösungen den Vergleich von Äpfeln mit Orangen darstellt. BigTable und Derivate ähneln eher gigantischen Schlüsselwerten oder Spaltenspeichern, und der Zeilenschlüssel ist von Natur aus ein Index .
Suman

1
Genau. Die Frage ist mit einem Tag versehen rdbmsund ich glaube nicht, dass BigTable in die Kategorie fällt.
Ypercubeᵀᴹ

2
@ypercube: ... Ja, das habe ich in meiner Antwort erwähnt. Aber es lohnt sich immer noch zu wissen, zumindest als Punkt des Interesses. Ich erwähnte auch einige andere Datenbanken, die RDBMS sind, die dies tun, und erklärte, warum es nicht üblich ist. Dies verdient definitiv keine Ablehnung ...
BlueRaja - Danny Pflughoeft

1
Ich habe nicht abgelehnt. Ich stimme zu, dass es ein sehr schwieriges Problem ist.
ypercubeᵀᴹ

10

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.


1
+1 Obwohl es durchaus möglich und machbar ist, dieses Zeug zu automatisieren, werden wir nicht immer mit einer Reihe magischer Indizes besser dran sein, die von einem System implementiert werden, das keinen Einblick in die Art und Weise hat, wie die Daten morgen verwendet werden Gegenüberstellung der abgelesenen Kompromissschwelle. Ich habe neulich ein bisschen darüber gebloggt , aber es gibt natürlich noch viel mehr zu erzählen.
Aaron Bertrand

> 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. So eine gute Antwort, sehr hilfreich.
Siddhartha

6

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.


-4

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.