Zu abstrakt?
Dann ein Beispiel: Angenommen wir haben eine Anwendung, die uns eine Liste unserer Kunden zeigt. Weiter angenommen, wir wollen zusätzlich zu den eigentlichen Kundendaten noch den Umsatz wissen, den der Kunde bereits in diesem Jahr mit uns gemacht hat. Logischerweise sind die Kundendaten und die Umsatzdaten nicht in der gleichen Datenbank-Tabelle.
Ein ungünstiger Algorithmus macht das dann so:
Liste<Kundenumsatz> umsaetze = new ArrayList<>();
for (Kunde kunde: db.sucheKunden())
{ Umsatz umsatz = db.sucheUmsatzFuerKunde(kunde); umsaetze.add(new Kundenumsatz(kunde, umsatz)); }
Problematisch ist hier, dass der Umsatz für jeden Kunden einzeln aus der Datenbank geladen wird. Wird die Liste für eine kleine Zahl von Kunden gesucht, merkt man das Problem nicht. Aber spätestens, wenn jemand eine Liste mit mehr als 10.000 Kundenumsätzen laden möchte, wartet er zwischen 10 Sekunden und 1,5 Minuten auf die Antwort.
Profiler im Einsatz
Glücklicherweise sind solche Probleme mit einem Profiler, der Datenbank-Abfragen mitschreibt, recht schnell zu finden. Typischerweise geht aus der Beschreibung einer Fehlermeldung schon hervor, dass das Problem nicht immer da ist, sondern nur, wenn viele Ergebnisse vorliegen - spätestens dann kommt der Profiler zum Einsatz. Da würde ich dann erwarten, in der Auflistung der abgesetzten Datenbank-Abfragen zu sehen, dass deren Zahl umso größer wird, je mehr Kunden gefunden werden.
Die Lösung? Gar nicht so kompliziert!
Die Lösung für ein solches Problem ist meistens gar nicht so kompliziert. Im besten Fall kann die Datenbank gleich mittels "join" den Umsatz zu jedem Kunden mitliefern. Das ist in der Regel am effizientesten. In Fällen, in denen das nicht geht, bietet es sich an, die gewünschten Ergebnisse (hier Umsätze) für eine Liste von Kunden abzufragen. Dann sind es noch zwei Datenbank-Abfragen: Eine für die Liste der Kunden und eine für die Liste der Umsätze. Diese Zahl bleibt konstant - egal, wie lang die Liste ist. Und der Anwender erhält wieder nach 0,5 - 1,5 Sekunden eine Antwort.