Werden B-Bäume und andere Datenstrukturen mit der Einführung von Solid-State-Laufwerken veraltet sein?

15

Viele (vielleicht die meisten?) Datenbankanwendungen verwenden heutzutage B-Trees und Variationen zum Speichern von Daten, da diese Datenstruktur die Lese-, Schreib- und Suchvorgänge auf einer Festplatte optimiert (und diese Vorgänge wiederum spielen eine wichtige Rolle für die Gesamteffizienz von die Datenbanken).

Sollten Solid State Drives (SSDs) herkömmliche Festplatten (HDDs) vollständig ersetzen, könnten B-Trees und Variationen veraltet sein und Platz für Datenstrukturen schaffen, die effizienter mit Direktzugriffsspeicher arbeiten? Wenn ja, wie sehen diese Strukturen aus? (zB Hash-Tabellen, AVL-Bäume)

Daniel Scocco
quelle
Fragen Sie, ob sie aus Sicht der Datenbankimplementierung veraltet sind oder im Allgemeinen, weil es viele andere Anwendungen außerhalb der Datenbankanwendungen gibt.
Pemdas
Aus Datenbanksicht.
Daniel Scocco

Antworten:

21

B-Trees werden am häufigsten für Datenbankindizes auf der Festplatte verwendet, haben jedoch angesichts der modernen Speicherhierarchie mit mehreren Cache-Schichten und virtuellem Speicher Vorteile auch als speicherinterne Datenstruktur. Auch wenn sich der virtuelle Speicher auf einer SSD befindet, wird sich dies nicht ändern.

Ich verwende eine speicherinterne B + -Baumbibliothek, die ich ziemlich oft in C ++ geschrieben habe. Es kann Leistungsvorteile haben - der Grund, warum es ursprünglich geschrieben wurde, war der Versuch, den Cache besser zu nutzen - aber ich muss zugeben, dass es oft nicht so funktioniert. Das Problem ist der Kompromiss, der bedeutet, dass sich Elemente beim Einfügen und Löschen innerhalb von Knoten bewegen müssen, was bei binären Bäumen nicht der Fall ist. Außerdem haben einige der Low-Level-Coding-Hacks, die ich zur Optimierung verwendet habe, den Optimierer verwirrt und besiegt, wie die Wahrheit sagt.

Selbst wenn Ihre Datenbanken auf einer SSD gespeichert sind, handelt es sich dennoch um ein blockorientiertes Speichergerät, und die Verwendung von B-Trees und anderen Multiway-Bäumen bietet immer noch einen Vorteil.

ABER vor ungefähr zehn Jahren wurden Cache-vergessene Algorithmen und Datenstrukturen erfunden. Diese berücksichtigen nicht die Größe und Struktur von Caches usw. - sie machen (asymptotisch) die bestmögliche Verwendung jeder Speichererbschaft. B-Bäume müssen auf eine bestimmte Speicher-Hierarchie "abgestimmt" werden, um die bestmögliche Nutzung zu erzielen (obwohl sie für eine Vielzahl von Variationen recht gut funktionieren).

Zwischenspeicherunabhängige Datenstrukturen werden in der Natur noch nicht oft oder überhaupt nicht gesehen, aber es kann durchaus sein, dass sie die üblichen speicherinternen Binärbäume überflüssig machen. Und sie können sich auch für Festplatten und SSDs als lohnenswert erweisen, da es ihnen egal ist, wie groß die Cluster- oder Festplatten-Cache-Seiten sind.

Das Layout von Van Emde Boas ist sehr wichtig für Datenstrukturen, die keinen Cache benötigen.

Der MIT OpenCourseware-Algorithmuskurs enthält einige Informationen zu Datenstrukturen, die für den Cache nicht relevant sind.

Steve314
quelle
1
Interessant. Sie haben einige gute Hinweise gegeben (kein Wortspiel beabsichtigt!), Um dieses Thema weiter zu untersuchen. Vielen Dank.
Daniel Scocco
Dieser MIT-Kurs enthält auch Informationen zu Datenstrukturen, die für den Cache nicht relevant sind.
Dan_waterworth
Hallo, meintest du, dass B-Tree veraltet sein wird, wegen Cache-vergessener Datenstrukturen, nicht wegen SSDs? Aber wie wäre es mit anderen Datenstrukturen wie der Blockverwaltung in einem DBMS?
Yang Bo
@ user955091 - Ich meinte wegen Cache-vergessener Datenstrukturen (pedantisch gesehen Strukturen, die im Cache-vergessenen Modell optimal sind), war aber damals etwas überfordert. Andere Datenstrukturen werden nicht so schnell verschwinden. Zum einen ist der Cache nicht das einzige Leistungsproblem - Parallelität stellt unterschiedliche Anforderungen. Außerdem ist die Notwendigkeit einer schlüsselbasierten Bestellung oft ein Sonderfall - normalerweise sind Hash-Tabellen König. Es kann schwierig sein , ein „randomisiert“ Layout als Cache-freundlich zu sehen, aber ein Zugriff auf direkt den Punkt zu holen ist schwer zu schlagen - Sie müssen nicht brauchen Lokalität.
Steve314
3

A priori, ja, die meisten Datenbank-Engines müssen neu geschrieben werden, da der B-Tree nicht mehr die effizienteste Datenstruktur zum Speichern von Daten ist, da die Lokalität auf einer Festplatte, auf der sich die Festplatte langsam bewegt und Daten abgerufen werden, von entscheidender Bedeutung ist in Blöcken, dh jede Änderung an den Daten muss:

  1. Bewegen Sie den Kopf auf der Festplatte an die richtige Stelle (~ 10 ms).
  2. Warten Sie, bis sich die Scheibe dreht (bei 10k U / min bedeutet dies 167 Umdrehungen pro Sekunde, aber im Durchschnitt warten wir nur eine halbe Umdrehung, also ~ 3ms).
  3. Lesen Sie den Block (~ 3ms).
  4. Ändern Sie im RAM. (~ 10ns)
  5. Bewegen Sie den Kopf wieder an die richtige Stelle auf der Festplatte (wieder ~ 10 ms).
  6. Warten Sie, bis sich die Festplatte erneut dreht (ca. 3 ms).
  7. Schreiben Sie den Block (~ 3ms).

Das sind 10 + 3 + 3 + 10 + 3 + 3 = 34 ms

Im Durchschnitt beträgt das Gleiche auf einer SSD nur 1 ms, unabhängig von der Position auf der Festplatte.

Und da eine Hash-Tabelle viel schneller ist, können wir uns vorstellen, dass eine Hash-Tabelle ein besserer Ersatz ist.

Das einzige Problem ist, dass Hashtables nicht in der richtigen Reihenfolge gespeichert werden und daher nicht wie Van Emde Boas das Nächste und Vorherige gefunden werden kann.

Sehen:

  1. http://en.wikipedia.org/wiki/Van_Emde_Boas_tree
  2. http://bryanpendleton.blogspot.com/2009/06/cache-oblivious-data-structures.html

Warum ist das Finden von Nächsten und Vorherigen wichtig? Stellen Sie sich vor, dass alle Elemente größer als x und kleiner als z sind. Verwenden Sie dazu Indizes mit den Optionen Vorherige suchen und Nächste suchen.

Nun, das einzige Problem ist, dass wir keine Hashtabellen mit Fähigkeiten zum Beibehalten der Reihenfolge gefunden haben. Vielleicht ist die Größe des Buckets im B-Tree wichtig, aber das wird mit Algorithmen behoben, die den Cache nicht berücksichtigen.

Ich würde also sagen, dass dies ein offenes Problem ist.

Wilhelm Van Ende Boas
quelle
Eine Hash-Tabelle ist (normalerweise) ein Cache-ahnungsloser WRT, der seine Leistung modelliert. Dies bedeutet jedoch nicht, dass sie in diesem Modell effizient ist. Das Problem ist, dass Hash-Funktionen normalerweise so konzipiert sind, dass sie Elemente "zufällig" verteilen. Deshalb sind Hash-Tabellen ungeordnet und haben auch eine schlechte Lokalität. Das heißt, auch wenn Sie eine Sequenz von Elementen mit benachbarten Schlüsseln identifizieren können, ist es unwahrscheinlich, dass Sie zwei oder mehr Elemente pro Block lesen (SSDs sind immer noch Blockgeräte).
Steve314
1
Natürlich Hashing wird manchmal auch „Schlüssel Transformation“ bezeichnet und die Transformation nicht haben zu „random“ zu sein - vielleicht ist es möglich , eine Hash - Funktion zu definieren , die für einigermaßen effizient sequenziellen Zugriff erlaubt (nicht die Suche zu beseitigen - Informationen werden von der verloren Hash-Funktion - aber minimieren) und bietet einige Vorteile für die Lokalität, während Hash-Kollisionen selten bleiben.
Steve314