2008-10-10 9 views
5

Ich erstelle zuerst eine Datenbank und Prototyping und Benchmarking. Ich verwende H2, eine Open-Source-, kommerziell freie, einbettbare, relationale Java-Datenbank. Ich bin momentan nicht in irgendeiner Spalte indexiert.Was verlangsamt die wachsende Datenbankleistung?

Nachdem die Datenbank auf etwa 5 GB angewachsen war, verdoppelte sich die Batch-Schreibgeschwindigkeit (die Schreibgeschwindigkeit wurde um das Zweifache der ursprünglichen Rate verringert). Ich schrieb ungefähr 25 Zeilen pro Millisekunden mit einer frischen, sauberen Datenbank und schreibe jetzt bei 7GB ungefähr 7 Zeilen/ms. Meine Zeilen bestehen aus einem kurzen, einem int, einem float und einem Byte [5].

Ich weiß nicht viel über Datenbank Interna oder sogar wie H2 programmiert wurde. Ich möchte auch erwähnen, dass ich H2 nicht schlecht mache, da dies ein Problem mit anderen DBMS ist, die ich getestet habe.

Welche Faktoren können die Datenbank so verlangsamen, wenn kein Indexing-Overhead vorhanden ist? Hat es hauptsächlich etwas mit der Dateisystemstruktur zu tun? Aus meinen Ergebnissen gehe ich davon aus, dass die Art, wie Windows XP und ntfs mit Dateien umgehen, es langsamer macht, Daten an das Ende einer Datei anzuhängen, wenn die Datei wächst.

Antwort

1

Dies wird höchstwahrscheinlich durch Felder mit variabler Breite verursacht. Ich weiß nicht, ob H2 dies erlaubt, aber in MySQL müssen Sie Ihre Tabelle mit allen Feldern mit fester Breite erstellen und sie dann explizit als Feldtabelle mit fester Breite deklarieren. Dadurch kann MySQL genau berechnen, wohin es in der Datenbankdatei für die Einfügung gehen muss. Wenn Sie keine Tabelle fester Breite verwenden, muss sie die Tabelle durchlesen, um das Ende der letzten Zeile zu finden.

Das Anhängen von Daten (wenn richtig gemacht) ist eine O (n) -Operation, wobei n die Länge der zu schreibenden Daten ist. Es hängt nicht von der Dateilänge ab, es gibt Suchoperationen, um diese einfach überspringen zu können.

+0

Ich habe vergessen zu erwähnen, dass mein Byte [5] -Feld tatsächlich in einem Blob-Feld (Feld variabler Länge) sitzt. Das könnte etwas damit zu tun haben. Vielen Dank für Ihre schnellen Antworten. –

0

Ein weiterer Grund ist, ob die gesamte Datenbank im Speicher gehalten wird oder ob das Betriebssystem eine Menge Plattenaustausch durchführen muss, um den Speicherort zum Speichern des Datensatzes zu finden.

0

Ich würde es auf I/O beschuldigen, vor allem, wenn Sie Ihre Datenbank auf einem normalen PC mit einer normalen Festplatte laufen (damit meine ich nicht in Server mit super schnellen Festplatten, etc).

1

Bei den meisten Datenbanken ist das Anhängen an eine Datenbankdatei definitiv langsamer als das Voranstellen der Datei und das anschließende Hinzufügen von Zeilen. Prüfen Sie, ob H2 das Vorwachstum der Datei unterstützt.

+0

Unabhängig davon, ob dies das Problem ist oder nicht, es klingt wie es wäre eine gute Idee, es vorher zu wachsen. Vielen Dank! –

2

Ein Faktor, der Beilagen erschweren kann, wenn eine Datenbank wächst, ist die Anzahl der Indizes in der Tabelle und die Tiefe dieser Indizes, wenn es sich um B-Bäume oder ähnliches handelt. Es gibt einfach mehr Arbeit zu erledigen, und es kann sein, dass Sie die Aufteilung von Indexknoten verursachen, oder Sie haben sich einfach von einer 5-Level-B-Struktur zu einer 6-Level-Struktur (oder allgemeiner, von N bis N + 1 Stufen). Ein anderer Faktor könnte Speicherplatznutzung sein - wenn Sie gekochte Dateien verwenden (das ist die normale Art für die meisten Menschen die meiste Zeit, einige DBMS verwenden 'Raw-Dateien' unter Unix, aber es ist unwahrscheinlich, dass Ihr Embedded-System würde dies tun, und Sie würden es wissen, wenn es getan würde, weil Sie es dazu sagen müssten), könnte es sein, dass Ihre größeren Tabellen jetzt auf der Festplatte fragmentiert sind, was zu schlechteren Leistungen führt.

Wenn das Problem auf der SELECT-Leistung lag, kann es viele andere Faktoren geben, die sich ebenfalls auf die Systemleistung auswirken.

+0

interessant, ich dachte nicht, dass die Datei über die Festplatte fragmentiert wird, aber ich nehme an, es muss sein, wenn es so groß ist! –

2

Das klingt ungefähr richtig. Die Leistung der Datenbank sinkt in der Regel erheblich, da die Daten nicht mehr im Speicher gehalten werden können und die Vorgänge an die Festplatte gebunden werden. Wenn Sie normale Einfügeoperationen verwenden und eine signifikante Leistungsverbesserung wünschen, empfehle ich, eine Art Massenlade-API zu verwenden, wenn H2 dies unterstützt (wie Oracle sqlldr, Sybase BCP, Mysql 'lade Dateninfile'). Diese Art von API schreibt Daten direkt in die Datendatei, wobei viele der Datenbank-Subsysteme umgangen werden.

0

Viele Datenbank-Engines erstellen für jede Aktualisierung einen impliziten Integer-Primärschlüssel. Selbst wenn Sie keine Indizes deklariert haben, wird Ihre Tabelle weiterhin indiziert. Dies kann ein Faktor sein.

0

Die Verwendung von H2 für 7G Datendateien ist aus technologischer Sicht eine falsche Wahl. Wie Sie gesagt haben, einbindbar. Welche Art von "eingebetteter" Anwendung haben Sie, wenn Sie so viele Daten speichern müssen.

0

Führen Sie inkrementelle Commits durch? Da es sich bei H2 um eine ACID-kompatible Datenbank handelt, gibt es eine Art von Redo-Log, wenn Sie keine inkrementellen Commits durchführen. Bei einem versehentlichen Ausfall (z. B. Stromausfall) oder Rollback können die Löschungen rückgängig gemacht werden.

In diesem Fall wird Ihr Redo-Protokoll möglicherweise größer und überlaufender Speicherpuffer und muss Ihr Redo-Protokoll auf die Festplatte schreiben, sowie Ihre tatsächlichen Daten, was zu Ihrem I/O-Overhead beiträgt.

Verwandte Themen