Java und Datenbank

  • Themenstarter Themenstarter hadda
  • Beginndatum Beginndatum
H

hadda

Hallo zusammen,
Ich habe eine Tabelle die enthält Daten, und ich muss Zeilweise ein Wert von dem nächste abziehen usw.…
Das funktioniert, aber es dauert ewig, denn die Tabelle enthält viele Datensätze ca 340000 Datensatz.

ich habe so gemacht, habe ein Vector erzeugt, da drin werden alle Werte gespeichert:

PHP:
Vector vector = new Vector();
Vector diffVector = new Vector();

stmt = con.createStatement();
rs = stmt.executeQuery(SQL);

while (rs.next)
{  
     vector.add(rs.getInt(1));
}

Int i;
While(i<vector.size()-1)
{
    tempdiff = Math.abs((Integer.parseInt(vector.get(i+1).toString())-  
    Integer.parseInt(vector.get(i).toString())));
    diffVector.add(tempdiff);
i++;

}
 
System.out.println(diffVector);
Aufgrund viele Anzahl der Datensätze, habe ich Problem es dauert lang, bis ich die Ergebnis bekomme, was kann man machen für dieses Problem.
Ich bitte um Hilfe.

Viele Grüße
Hadda
 
Zuletzt bearbeitet von einem Moderator:
Schüttel :-)

Für den Anfang solltest du mal diese ganze String-Hin-und-Her-Konvertiereri sein lassen.
Die frisst wahnsinnig Performance und ist völlig überflüssig.

Zudem - wenn du nicht grade mit mehreren Threads arbeitest, solltest du auf die Tread-safe Klasse Vector verzichten und die ArrayList verwenden.

Und weil du vorher schon weißt, dass du so viele Datensätze haben wirst, solltest du deine ArrayList auch gleich so groß machen - ansonsten fängt er glaube ich bei 8 Datensätzen an und verdoppelt dann immer wieder die Arraygröße. Kannst dir die Schritte ausrechnen, bis du bei deiner Größenordnung bist.

Java:
ArrayList<integer> vector = new ArrayList(400000)<integer>; 
ArrayList<integer> diffVector = new ArrayList(400000)<integer>; 

stmt = con.createStatement(); 
rs = stmt.executeQuery(SQL); 

while (rs.next) 
{   
     vector.add(rs.getInt(1)); 
} 

Int i; 
While(i<vector.size()-1) 
{ 
    tempdiff = Math.abs(vector.get(i+1) - vector.get(i)); 
    diffVector.add(tempdiff); 
i++; 

} 
  
System.out.println(diffVector);
 
Hallo,

Danke für Ihre Antwort, Ja es hat jetzt c.a 3 min gedauert aber immerhin besser.

Leider die Tabelle wird immer ständig weiter mit Datensätze gefüllt, jetzt habe ich versucht bevor ich die ArrayList deklarieren , hole ich mich wie viel Datensätze in Der Tabelle gibt es , dann setze ich als Größe für meine ArraList.

Und ich habe noch ein SQL –Statement erzeugt, der für normale Abfrage damit ich alle Werte bekomme.

Java code
PHP:
// Anzahl der Datensätze
String anzahlzaetze = "SELECT count(*)  FROM table";
// die Datensätze aus Tabelle 
String SQL ="select Id, wert from table";

stmt = con.createStatement();	
	         
count = stmt.executeQuery(anzahlzaetze);
rs = stmt.executeQuery(SQL);

ArrayList<Integer> Vector = new ArrayList<Integer>(count.getInt(1)); 
ArrayList<Integer> DiffVector = new ArrayList<Integer>( count.getInt(1));

while (rs.next()) { 
    Vector.add(rs.getInt(1));
}

int i = 0;
int difftemp = 0;
while(i < Vector.size()-1){

   difftemp = Math.abs(Vector.get(i+1)-Vector.get(i));
   DiffVector.add(difftemp);
   i++;
}
	     
System.out.println(DiffVector);


Ich bekomme folgende Fehler Meldung:

PHP:
com.microsoft.sqlserver.jdbc.SQLServerException: Das Resultset wurde geschlossen.
	at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(Unknown Source)
	at com.microsoft.sqlserver.jdbc.SQLServerResultSet.checkClosed(Unknown Source)
	at com.microsoft.sqlserver.jdbc.SQLServerResultSet.getterGetColumn(Unknown Source)


Danke sehr für Ihre Hilfe
Viele Gürße
Hadda
 
Man kann natürlich noch ein bisschen am Algorithmus feilen, aber irgendwann solltest du dir mal Gedanken machen, ob eine Tabelle mit 300000 Datensätzen überhaupt Sinn macht

Java:
// Anzahl der Datensätze 
String anzahlzaetze = "SELECT count(*)  FROM table"; 
// die Datensätze aus Tabelle  
String SQL ="select Id, wert from table"; 

stmt = con.createStatement();     
              
count = stmt.executeQuery(anzahlzaetze); 
rs = stmt.executeQuery(SQL); 

ArrayList<Integer> Vector = new ArrayList<Integer>(count.getInt(1));  
ArrayList<Integer> DiffVector = new ArrayList<Integer>( count.getInt(1)); 

int value_old = 0;
while (rs.next()) {  
    Vector.add(rs.getInt(1)); 
    DiffVector.add(Math.abs(rs.getInt(1)-value_old)); 
} 
          
System.out.println(DiffVector);

Und Variablen schreibt man klein - Klassen groß!
 
Danke sehr, ja ich muss die Tabelle komplett durchlesen und die Berechnung machen. und in der Zukunft werden immer mehr Daten.
was kann man in diesem Fall mit Java machen. gibt es Tipp oder Trick, um die Zeit des Subtrahierens zu beschleunigen?
 
Algorithmisch bist du denk ich mit meiner letzten Variante am Ende.
Gibt aber noch nen Trick.

Mach's eben nicht in Java.
Mach's noch nicht mal am eigenen Rechner.
Mach's in der Datenbank!

SQL:
select t1.id, t1.wert, (t1.wert - t2.wert) as diff
from table t1, table t2
where t1.id + 1 = t2.id
 
Ja das mit der Datenbank ist sicher eine gute Idee. Noch ein Verbesserungsvorschlag für die Abfrage:

SQL:
SELECT t1.id, t1.value, t2.id, t2.value, t1.value-t2.value AS diff 
FROM IdTable t1 JOIN IdTable t2 
          ON (t1.id+1) = t2.id

Nen Join ist ein wenig besser als eine Auswahl aus eine kartesischem Produkt.
 
Nen Join ist ein wenig besser als eine Auswahl aus eine kartesischem Produkt.

Ich lebe hauptsächlich mit Informix, da gibts das nur so :-), dürfe aber auch dafür entsprechend optimiert sein.

Hab das mit dem SQL-Server übersehen, da würde ich dann grundsätzlich auch zu so nem Join raten.
 
Hallo zusammen,

Danke sehr für Ihre Hilfe :), sehr gute und saubere Idee.
Aber eins ist wichtig, die zeit der Berechnung wird Optimal, wie eine normale Select-abfrage
Ich werde mal dran arbeiten ,es könnte sein , dass ich ab und zu euch mal fragen.
Danke schön für Ihre Hilfe.

Viele Grüße,
Hadda
 
Hallo

Es hat geklappt wunderbar, und habe noch ein Problem, das Ergebnis möchte ich in anderer Tabelle einfügen, dh alle Datensätze man kann Cursor einsetzen, aber es ist langsam.
z.B.:
man kann auch
PHP:
select * into table3  from table_ergebnis
aber table3 wird jedes Mal neu erzeugt, das will ich nicht ,sondern in einer bestehende Tabelle alle Daten einfügen ohne Cursor.

gibt es andere Methode in SQL ?
Danke für Ihre Hilfe

Viele Grüße
Hadda
 
Zurück