Hallo,
ResultSet rs = statement.execute();
int cnt = 0;
while ((rs.next()) && (cnt < 10)) {
// Tu irgendwas
cnt++;
}Welche Lösung ist schneller? Ist eine schneller? Oder hängt es vom DBMS ab, wie genau LIMIT implementiert wurde?
Übrigens: Wo begrenzt Du hier das Resultset?
Das ist jetzt eben die Frage. Wenn das Resultset bei einem "statement.execute()" komplett geholt wird, ist natürlich die Lösung mit LIMIT vorzuziehen.
Aber: Dessen bin ich mir eben nicht sicher. Ich denke nämlich, dass
"statement.execute()" das Resultat in der Datenbank komplett vorbereitet, aber nicht komplett zurückliefert.
Die Daten einer Zeile geholt werden (denke ich) erst bei rs.next();
Wenn ich "ORDER" weglassen würde, wär wohl auf jeden Fall die "LIMIT"-Variante schneller - denn dann würde die Datenbank im LIMIT-Fall nur die ersten X Zeilen einer Tabelle lesen, im anderen Fall alles.
Fürs Sortieren muss die datenbank ja aber ohnehin die ganze Tabelle lesen. Es sei denn, es liegt ein Index für das Sortierkriterium vor (war aber in diesem Fall auch nicht so, da dass Sortierkriterium eine Funktion war)
Im Spezialfall: Teste doch. Dazu bieten vernünftige DBMS übrigens Werkzeuge.
Teste mit einer Tabelle mit 10 Millionen Datensätzen. Lass Dir einmal nur die ersten 10 zurückgeben, danach alle und betrachte nur die ersten 10.
Jo, das werd ich mal tun, wenn wieder Luft ist.
Grundsätzlich gilt: Fordere keine Daten an, die Du nicht benötigst. Deswegen ist in sehr vielen Fällen
SELECT * FROM
Jepp, da hast Du recht, zumal "*" ja nicht unbedingt festlegt, in welcher Reihenfolge die Spalten ankommen, was zum verarbeiten der Ergebnisse keine Freude ist :).
War jetzt auch nur ein Beispiel, im realen Szenario hatte ich schon Spaltennamen angegeben :)
Danke für die Einfälle.
Grüße,
Jörg