HSQLDB SELECT Performance

P

Philipp00

Hallo

es geht bei mir um folgende Sache:

Ich habe zwei Datenbänke a und b, die ich aus zwei verschiedenen Dateien auslese (und parse).

Datenbank a umfasst ~72000 relevante Datensätze in folgendem Format:
(id_a), Name, Jahr, Aka Name

Datenbank b umfasst ~225000 relevante Datensätze im Format:
(id_b), Name, jahr, Rating

Bis auf (id) sind alle Felder Strings (was so auch nötig ist).

Datenbank a ist eine echte Teilmenge von Datenbank b.
Also enthält Datenbank a weitere Informationen ("Aka Name") für einige Daten aus Datenbank b.

Die einzelnen Datensätze werden eindeutig nur über die Kombination Name+Jahr identifiziert.

Für das Parsen beider Datenbänke aus den Dateien braucht mein Programm rund 20 Sekunden, also ca. 15000 Datensätze pro Sekunde.

Beide Datenbänke werden dann in jeweils eine eigene HSQLDB geschrieben.
Die HSQLDB läuft als mem, also nur im Speicher:
Connection connection = DriverManager.getConnection("jdbc:hsqldb:mem:DATENBANKNAME", "SA", "");

Das Problem: Die Datenbanken müssen noch synchronisiert werden:

"FINDE Name+Jahr AUS b MIT Name+Jahr AUS a gegeben" ist mein Problem.

In meinem 1. Ansatz habe ich alles über ArrayLists gemacht (auch das einlesen). Da war ich bei ca. 500 Datensätzen pro Sekunde.

Im 2. Ansatz habe ich dann anstelle von Arrays die HSQL Datenbanken benutzt, und war bei vlt. 1 Datensatz pro Sekunde bei folgender Schematik:
"SELECT/UPDATE ... WHERE title = ? AND year = ?"
mit ? über preparedStatement je Datensatz aus b gegeben.
Ob SELECT oder UPDATE hatte dabei wenig Einfluss auf die Geschwindigkeit.

Nun ist das aber eine sehr schöne und bequeme Lösung mit der HSQL Datenbank, das mit den ArrayList hingegen 'ne blöde Fummelei.

Und ehrlich gesagt kann ich mir gar nicht vorstellen, dass eine Datenbank für so eine Abfrage dermaßen lange braucht.

Also, was mache ich falsch? Oder ist es Konzeptbedingt? Gibt es schneller Alternativen? Sollte ich doch wieder zu den Arrays zurück?

Vielen Dank schonmal :)
 
Ähm, fast:

a ist (leider) keine echte Teilmenge von b, da einige Datensätze aus a nicht in b vorkommen.
 
Muss das denn sein, dass du zwei Datenbanken (nicht Datenbänke!) hast anstatt zwei Tabellen in einer Datenbank? Dann könntest du nämlich einfach einen Join zwischen den Tabellen machen, was bei passenden Indexen deutlich schneller als deine Javalösung sein wird.
 
Zurück