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)
database
data-structures
Daniel Scocco
quelle
quelle
Antworten:
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.
quelle
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:
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:
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.
quelle