Ich verwende den folgenden Code
%Vor%Die Abfrage gibt viele (800k) Zeilen zurück und es dauert sehr lange (~ 2m) zwischen dem Ausdruck "start query" und "done query". Wenn ich manuell eine "Grenze 10000" in meine Abfrage einfüge, gibt es keine Zeit zwischen "start" und "done". Die Verarbeitung der Ergebnisse benötigt Zeit, ich denke also, es ist insgesamt schneller, wenn es nur 1k Zeilen aus der Datenbank holt, diese verarbeitet und wenn es keine Zeilen mehr hat, kann es neue im Hintergrund bekommen.
Der ResultsSet.CONCUR_READ_ONLY usw. wo meine letzte Schätzung; vermisse ich etwas?
(es ist ein postgresql 8.3 Server)
Die beiden Abfragen machen ganz andere Dinge.
Mit der LIMIT
-Klausel wird die Größe der Ergebnismenge auf 10000 begrenzt, während die Abrufgröße nicht festgelegt wird, sondern stattdessen dem Treiber ein Hinweis gegeben wird, wie viele Zeilen gleichzeitig abgerufen werden sollen die Ergebnismenge - die alle 800k Zeilen enthält.
Wenn also setFetchSize
verwendet wird, erstellt die Datenbank die vollständige Ergebnismenge, deshalb dauert es so lange.
Zur besseren Übersicht bearbeiten: Das Setzen der Abrufgröße bewirkt nichts, wenn Sie nicht durch das Ergebnis iterieren (siehe Jons Kommentar), aber das Erstellen eines viel kleineren Ergebnissatzes über LIMIT macht einen großen Unterschied.
Dies hängt von Ihrem Treiber ab. Aus der Dokumentation:
Gibt dem JDBC-Treiber einen Hinweis auf die Anzahl der Zeilen, die abgerufen werden sollen aus der Datenbank, wenn mehr Zeilen sind erforderlich. Die Anzahl der angegebenen Zeilen betrifft nur Ergebnismengen, die mit erstellt wurden diese Aussage. Wenn der Wert angegeben ist ist Null, dann wird der Hinweis ignoriert. Das Standardwert ist Null.
Beachten Sie, dass hier "ein Hinweis" steht - ich würde damit meinen, dass ein Fahrer den Hinweis ignorieren kann, wenn er es wirklich möchte ... und es klingt, als ob das passiert.
Tags und Links java postgresql jdbc cursor