sql >> Databasteknik >  >> RDS >> Oracle

Att iterera en ResultSet med JDBC för Oracle tar mycket tid, ungefär 16 sekunder?

Jag har skapat en tabell med 4000 rader och 10 kolumner med 10 tecken vardera och gjort ett enkelt prestandatest med följande tillvägagångssätt (RealTimeCounter är en klass som mäter realtiden mellan start() och stop() ):

List<String> myResult = new ArrayList<>();
ResultSet rs = s.executeQuery("SELECT * FROM Performance");

RealTimeCounter rtc = new RealTimeCounter();
rtc.start();
while(rs.next()) {
    myResult.add(rs.getString(1));
}
rtc.stop();
System.out.println(rtc);

Resultat:

  • Standard hämtningsstorlek:körningstiden är ca. 20 sek
  • hämtningsstorlek =100:körningstiden är ca 2,2 sek
  • hämtningsstorlek =500:körningstiden är cirka 450 msek
  • hämtningsstorlek =2000:körningstiden är cirka 120 msek
  • hämtningsstorlek =4000:körningstiden är cirka 50 msek
  • hämtningsstorlek =4001:körningstiden är ca 10 msek (!!)

Så, hämtningsstorleken gör har en betydande inverkan på exekveringshastigheten.

Observera att å andra sidan har hämtningsstorleken viss inverkan på minnesförbrukningen. Intressant nog, en snabb analys med Runtime.getRuntime().freeMemory(); före och efter ovanstående kod visade att effekten är mycket mindre än jag skulle förvänta mig. Siffrorna jag fick är:

  • Standard hämtningsstorlek:665k
  • hämtningsstorlek =100:665k
  • hämtningsstorlek =500:665k
  • hämtningsstorlek =2000:743k
  • hämtningsstorlek =4000:821k
  • hämtningsstorlek =4001:861k


  1. Sql*plus returnerar alltid utgångskoden 0?

  2. Bifoga strängar i enstaka citattecken i SQLite-frågeresultat

  3. Hur man aktiverar långsamma frågeloggar i AWS RDS MySQL

  4. SSL för PostgreSQL-anslutningsnoder