# 20 MB Datenbankanfrage?



## Paula (7. Mai 2006)

Hallo,

ich schlage mich gerade mit folgender Datenbankanfrage herum:

"SELECT bf.Aufnahme AS abteilung, bf.*  FROM bf WHERE ((bf.ID)=12"

Wenn ich diese Abfrage in Java ausführe benötigt er (laut JProfiler) 40 MB Arbeitsspeicher. Das finde ich schon etwas heftig. Als Ergebnis bekomme ich ca. 45.000 Zeilen und das ist nicht viel. Gibt es hier möglichkeiten der Speicher-Optimierung?


----------



## foobar (7. Mai 2006)

Lass dir nur die Spalten zurück geben, die du wirklich brauchst und such dir einen performanten JDBC-Treiber, da gibt es Unterschiede wie Tag und Nacht.


----------



## Paula (7. Mai 2006)

Welcher JDBC Treiber ist denn der performanteste? Gibt es irgendwo eine Liste damit ich diese mal durchtesten kann?


----------



## abollm (7. Mai 2006)

Paula hat gesagt.:
			
		

> Welcher JDBC Treiber ist denn der performanteste? Gibt es irgendwo eine Liste damit ich diese mal durchtesten kann?



Welche(s) RDBMS benutzt du?


----------



## Paula (7. Mai 2006)

Ich nutze mysql


----------



## abollm (7. Mai 2006)

Paula hat gesagt.:
			
		

> Ich nutze mysql



Die Geschwindigkeit der Abfrage ist in Ordnung?

Ansonsten schaue einmal nach, ob du der JVM genügend Speicher gegeben hast, evtl. hat der GC Probleme.

Zu den Treibern: Ich habe zwar schon längere Zeit nichts mehr mit MySQL getan, aber mit den von MySQL gelieferten JDBC-Treibern hatte ich nie Probleme.


----------



## Paula (7. Mai 2006)

Ja die Geschwindigkeit ist in Ordnung nur der Speicherverbrauch ist enorm. Wenn ich mir die DB mal näher ansehe so hat die gesamte Tabelle 335.000 Einträge und ist 50MB groß (laut phpMyAdmin). Und in Java soll eine Teilabfrage über 45.000 Einträge 40 MB groß sein?


----------



## bronks (8. Mai 2006)

Paula hat gesagt.:
			
		

> ... ca. 45.000 Zeilen und das ist nicht viel ...


Doch, das ist außerordentlich viel. Erzähl mal was Du mit diesen 45.000 Sätzen vorhast.


----------



## Leroy42 (8. Mai 2006)

Ich bin zwar ein SQL-Anfänger aber brauchst du diese 45.000 Zeilen
denn alle auf einmal?

Hilft es vielleicht, sie mit LIMIT <von>,<anz> Schritt für Schritt
abzuarbeiten?


----------



## abollm (8. Mai 2006)

Also mal einige Bemerkungen zu 45.000 selektierten Zeilen. Im Grunde ist diese Anzahl von Zeilen in einer Tabelle nicht besonders groß.

Problematisch wird es erst dann, wenn man anfängt diese Anzahl komplett z.B. in eine JTable zu schreiben. Dann erhältst du eine Art Performanz-GAU. Auch wird der Client-Speicher in diesem Fall arg beansprucht, weil ja die JTable alle diese selektierten Zeilen (womöglich hat jede Zeile mehr als 20 Spalten) darstellen und damit den entsprechend benötigten Speicher vorhalten muss. Das ist natürlich in der Praxis ziemlicher Unfug, egal ob unter Java oder unter einer anderen Programmiersprache (C++, C# ...).

Deshalb solltest du - sofern du diese Zeilen alle anzeigen lassen musst - sie sukzessive (z.B. in Schritten à max. 500 Zeilen) anzeigen lassen.


----------



## Paula (8. Mai 2006)

Danke für den Tipp, aber ich zeige die Daten nicht an. Ich lese diese nur aus und rechne damit etwas rum um dann eine Zeile als Endergebnis anzuzeigen.


----------



## abollm (8. Mai 2006)

Paula hat gesagt.:
			
		

> Danke für den Tipp, aber ich zeige die Daten nicht an. Ich lese diese nur aus und rechne damit etwas rum um dann eine Zeile als Endergebnis anzuzeigen.


Evtl. liegt genau darin der Knackepunkt, deshalb die Frage:
Wie genau liest du die Daten aus und manipulierst sie, um das Endergebnis anzuzeigen?

Magst du dazu mal ein wenig exemplarischen Code posten?


----------



## AlArenal (8. Mai 2006)

In Abhängigkeit dessen, was du da berechnest, wäre es vielleicht klüger das direkt in der Datenbank zu machen und nur due (Zwischen-)Ergebnisse abzufragen...


----------

