2010-05-13 9 views

Antwort

55

Ich nahm an der Beta-Evaluierung des BDB SQLite-Codes und einer der Dinge, die ich versuchte, einen Griff zu bekommen, war der Leistungsunterschied. An dieser Stelle, kann ich nicht genau das, was ich gefunden habe, veröffentlichen, bis ich mindestens eine andere Person habe meinen Code auswerten, die Tests ausführen und die Zahlen bestätigen, die ich bekommen habe (was getan wird). Allerdings kann ich hier verallgemeinern und sagen, dass es Fälle gibt, in denen BDB erhebliche Leistungsverbesserungen gegenüber SQLite bietet, speziell im Bereich der Handhabung schwerer Lasten, die Schreib-Parallelität beinhalten.

Es gibt im Allgemeinen zwei Maßnahmen von „schnell“ rechts - (1) Effizienz: Wie lange macht es für einen einzelnen Prozess nehmen zu tun XYZ vs. (2) Gleichzeitigkeit: wie oft kann viele Prozesse tue XYZ pro Zeiteinheit. Das Hauptproblem BDB-Adressen ist Nebenläufigkeit - große Transaktionsverarbeitung. Daher denken Sie an viele gleichzeitige Verbindungen, die an den Inhalt der Datenbank schreiben und/oder ihn modifizieren.

SQLite von Entwurf verwendet Sperren auf Datenbankebene, so gibt es ein Maximum Writer, der in der Datenbank gleichzeitig arbeiten kann. Daher bleibt die Transaktion von SQLite mit der Anzahl der gleichzeitigen Verbindungen mehr oder weniger konstant, so dass die Skalierbarkeit in schreibintensiven Anwendungen durch die Effizienz (1) gemessen wird.

BDB auf der anderen Seite verwendet Sperren auf Seitenebene, die mehrere Writer zu in der Datenbank zu einer bestimmten Zeit arbeiten können (vorausgesetzt, sie arbeiten an separaten Seiten). Somit steigt die Rate von BDB potentiell mit der Anzahl von Verbindungen und so ist ihre Skalierbarkeit sowohl eine Frage der Effizienz (1) als auch der Gleichzeitigkeit (2), die sich addieren kann.

Hauptsächlich läuft es auf (Schreib-) Nebenläufigkeit. BDB kann mehr TPS als SQLite für mehrere Autoren schieben. Mit Transaktion meine ich etwas, das die Datenbank modifiziert (wie sind sie wirklich hilfreich für schreibgeschützte Operationen?). Das heißt, für Lesen Nebenläufigkeit (Apps, die hauptsächlich SELECTs), SQLite könnte sehr gut gehen Kopf an Kopf mit BDB, weil Sperren nicht mehr ein kritisches Problem ist.

Wie für die Größe des Datasets bin ich mir nicht sicher. Ich habe nicht in das geschaut. Letztendlich verwenden beide B-Bäume für die Lagerung. Es kann Faktoren geben in ihre jeweiligen Implementierungen zu berücksichtigen, aber ich habe das nicht untersucht. I wissen, dass SQLite kann Datensätze in die Hunderte von MBs und zweistelligen GBs (und vielleicht mehr, jetzt, dass die Dirty-Page-Map-Implementierung wurde geändert) elegant behandelt werden.

Deshalb, wenn Sie eine Anwendung, die viele Verbindungen verwendet, die eine bestimmte Datenbank und Seitenkonflikte ändern relativ niedrig ist, dann kann BDB signifikante Performance-Verbesserungen bieten. Aber Seitenkonflikt ist eine kritische Variable. Wenn Sie eine BDB-Datenbank haben, deren Daten aus einer einzelnen Seite von bestehen, würde die Leistung in allen Fällen der von SQLite entsprechen, da die Sperrung auf Seitenebene hier effektiv in den Gegenwert von Sperren auf Datenbankebene degeneriert kämpft um eine Sache. Wenn jedoch die Anzahl der Seiten in BDB erhöht wird (und die Seitenkonflikte abnehmen), wird die maximale TPS beginnen, mit der Anzahl der gleichzeitigen Verbindungen zu wachsen. Dann von diesem Punkt wird Speicher der nächste begrenzende Faktor. Aber das ist eine andere Geschichte.

BTW, ich bin dabei, einen Artikel über die Verwendung von BDB für die kommenden von SQLite zu schreiben.

Artikel Links:

Oracle Berkeley DB SQL API vs. SQLite API – A Technical Evaluation

Oracle Berkeley DB SQL API vs. SQLite API – Integration, Benefits and Differences

+3

Wie kommt dieser Artikel? –

+1

Es ist eine Weile zurück. Es liegt jetzt nicht mehr in meinen Händen. Nicht sicher wann, wo es veröffentlicht wird. Kann nächste Woche etwas hören. –

+2

Hier sind die zwei Weißbücher aus dem Artikel: http://www.oracle.com/technetwork/database/berkeleydb/learnmore/bdbvssqlite-wp-186779.pdf http://www.oracle.com/technetwork/database/berkeleydb /learnmore/bdbvssqlite-wp-186779.pdf –

10

Das ist irgendwie eine geladene Frage. Die Ergebnisse würden dramatisch je nach Plattenzugriffsgeschwindigkeit, die Größe des Cache im Speicher, die Anzahl der Einsätze variieren vs. liest, Seitenteilungen, Parallelität, etc, etc, etc.

Insgesamt BerkeleyDB kann extrem schnell sein - Ich habe kürzlich eine Datenanalyse-Plattform für einen Arbeitgeber entwickelt, die in der Lage war, 40.000 Inserts pro Sekunde auf einem 8-Kern-x86-System (und gleichzeitig Tausende von Lesevorgängen pro Sekunde) mit einem Datensatz im 30G-Bereich durchzuführen. Dies war mit vollem Transaktionsschutz.

Das war jedoch der beste Fall - es gab Fälle, in denen die Anzahl der Inserts auf 2k pro Sekunde sinken konnte, abhängig von den eingehenden Daten und den Daten, die zur Zeit in Berkeley gespeichert wurden. Die Leistung sinkt erheblich, wenn Sie eine langsame Festplatten-I/O und eine schlechte Cache-Trefferrate haben oder die Datenbank ständig erweitern, was zu Seitenaufteilungen führt. Es gibt auch eine enorme Menge an Optimierung, die Sie tun können, um die Leistung für Ihren bestimmten Datensatz zu erhöhen.

Insgesamt ist es ein ausgezeichnetes System, aber Dokumentation und Wissen ist ziemlich dünn. Ich empfehle The BerkeleyDB Book als wahrscheinlich die beste derzeit verfügbare Referenz.

6

Neben der Berkeley DB Buch, dass Brian erwähnt, können Sie auch die folgenden Ressourcen nützlich finden können:

  • Die Berkeley DB Online-Foren können viele Vorschläge von Benutzern und bieten die Entwickler des Produkts. Siehe Berkeley DB forum,
  • Die Berkeley DB Dokumentation, die here gefunden werden kann. Insbesondere gibt es im Referenzhandbuch mehrere Abschnitte, die Abstimmung, Leistung und Durchsatz abdecken.