Datenbank Optimierung?

Maik20

Erfahrenes Mitglied
Hallo,

ich habe ein kleines Tool geschrieben mit dem unsere Kunden Ihre Daten in unser Format konvertieren können. Bisher lief alles recht flott. Jetzt habe ich jedoch ein Problem mit der Laufzeit.

Entwickelt wurde in Java, Datenbank ist Derby (JavaDB) in der embedded Version.

Ich habe folgende SQL Anweisungen:

Code:
Statement stmt = db.getConnection().createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);

PreparedStatement ps = db.getConnection().prepareStatement("INSERT INTO ERGEBNIS (F1,F2,F3) VALUES(?,?,?)");
				
PreparedStatement psSelect = db.getConnection().prepareStatement("SELECT F1 AS LNR, F2 AS DATUMAB, F3 AS UHRZEITAB FROM FI_DATEN WHERE F4='B17' AND KNR=? AND F2>=? AND F5<=?");

ResultSet rs = stmt.executeQuery("SELECT F1 AS FIK, F2 AS FES, F3 AS FHIK, F3 AS AD, F4 AS ED FROM KUNDEN");
rs.last();
log.getJProgressBar().setMaximum(rs.getRow());
rs.beforeFirst();
while (rs.next()){
  // In der Schleife wird für jeden Eintrag psSelect und ps ausgeführt.
}

Ich erstelle vorher zwei PreparedStatments. In das erste werden die Ergebnisse eingetragen die ermittelt wurden im Zweite wird ein Teilbereich selektiert (Abhängig von der Hauptschleife) um das Ergebnis zu berechnen.

Somit habe ich zwei Select geschachtelt. Die äußere Select Anweisung hat ca. 7000 Einträge. Für jeden der 7000 Einträge gibt es ca. 1 - 20 Einträge in der inneren Select Anweisung. Um ca. 10% der Schleife abzuarbeiten benötigt das Programm ca. 15 Minuten.

Das finde ich ungewöhnlich lang.

Die Tabelle FI_DATEN hat folgenden Index (nicht Primär):
Felder(F4, KNR, F2)

Die Tabelle KUNDEN hat auch einen Index ist jedoch irrelevant, da alle Einträge durchlaufen werden müssen.

Ich glaube beim Index bin ich schon optimal aufgestellt, lasse mich aber gerne eines besseren belehren. Auch der Einsatz von PreparedStatements ist sinnvoll, da ich immer wieder auf die gleiche SQL Abfrage in der Schleife zugreifen eben nur für unterschiedliche Bereiche.

- Jemand eine Idee was hier ggf. noch zu optimieren ist?
- Welche Laufzeit (unabhängig des DB Systems) wäre für euch normal?
- Oder liegt es gar an Java (dann würde ich nochmal im Java Forum posten)?
 
Zurück