# performance frage



## headgrowe (31. Jul 2009)

also ich habe 2 mal das gleiche auf verschiedene weise abgefrag und es dauerte verschieden lang...hab hier die 2 codebeispiele...

tabellenstruktur:

0 <= nummer <= 100....die tabelle hat 500.000 zeilen um die performance zu testen

ID|  nummer

1 |  3
2 |  99
3 |  3
4 |  6
....

nun die abfrage....ich mochte wissen, wie offt zb. die zahl 5 oder 40 vorkommt:

abfrage 1: dauert 27sec

```
String[] colums = {"nummer","anzahl"};
Object[][] data = new Object[101][2];
	for (int i=0;i<=100;i++){			
			ResultSet rs = st.executeQuery("SELECT ID,nummer FROM test where nummer =" + i);
			rs.last();
			data[i][0] = i;
			data[i][1] = rs.getRow();
			rs.close();
		}
```

abfrage 2: dauert nur 4sec


```
ResultSet rs = st.executeQuery("SELECT ID,nummer FROM test where ID < 500000");
		int[] a = new int[101];
		while(rs.next())
		{			
			a[rs.getInt(2)] += 1;
		}
		for(int i = 0;i<=100;i++){
			data[i][0] = i;
			data[i][1] = a[i];
		}
		rs.close();
```

ich dachte immer datenbanken sind dafür gebaut abfragen zu machen? und nicht das ich alles rauslese und dann selber auswerte...hmmm

die ausgabe sieht so aus:

...
3	4888
4	5002
5	5106
6	5108
7	5069
...


----------



## SlaterB (31. Jul 2009)

die Bedingungen sind unfair, 100 DB-Abfragen sind allein schon vom Transportaufwand langsam,
von 100x alle Datensätze durchlaufen in der DB ganz zu schweigen

vergleiche deine 4 sec (+ Speicherbedarf usw.) mit

 ResultSet rs = st.executeQuery("SELECT nummer,count(*) FROM test group by nummer");


----------



## headgrowe (31. Jul 2009)

hehe,
(1-2sec) war ja klar^^ hätte mich stark gewundert, wenn sqlDB langsammer ist.... nur ich kenn die sql befehle nicht  gibts da ein gutes tutorial?


----------



## SlaterB (31. Jul 2009)

wo nicht, google liefert tausende,
was bestimmtes kann ich allerdings nicht empfehlen


----------



## headgrowe (31. Jul 2009)

schade....und wenn wir schon bei performence sind......das schreiben, so wie ich es mache^^ is schlecht
da muss es was besseres geben 

for(...i<1000)
rs.moveToInsertRow();
rs.updateString("name", "Danke SlaterB"+i);
rs.insertRow(); //wird ja immer gleich in die DB geschrieben...kostet natürlich per.


----------



## frapo (31. Jul 2009)

headgrowe hat gesagt.:


> hehe,
> (1-2sec) war ja klar^^ hätte mich stark gewundert, wenn sqlDB langsammer ist.... nur ich kenn die sql befehle nicht  gibts da ein gutes tutorial?



Sql lernen - ein Tutorial zum Selbststudium mit einer Beispiel-Datenbank


----------



## headgrowe (31. Jul 2009)

supa! so ein tutorial hab ich gemeint


----------



## frapo (31. Jul 2009)

headgrowe hat gesagt.:


> supa! so ein tutorial hab ich gemeint



War gleich der erste link bei google .. die Schlagworte waren *SQL* und *Tutorial*. Du siehst, dass ist alles keine Hexerei


----------



## headgrowe (31. Jul 2009)

hmmmm das stimmt...der erste link is immer der beste^^

naja, leider hat das meine frage zu "schreiben" nicht ganz beantwortet...
wie kann ich zb. 1000 zeilen in eine DB schreiben^^
und das nicht, das ich "insert into..." in eine schleife gäbe....;(
oder einen ewich langen string mit "insert into...UNION...UNION.." mache

sondern direct alle 1000 zeilen an sql schicke...oder mit einem stream...was weiß ich^^
wie kann ich new Obejct[1000][10] am besten schreiben?


----------



## musiKk (31. Jul 2009)

Statement hat eine Methode addBatch(), da kann man mehrere SQL-Befehle übergeben und mit executeBatch() abschicken. Muss aber vom JDBC-Treiber unterstützt werden.


----------

