Oracle
 sql >> Base de données >  >> RDS >> Oracle

L'itération d'un ResultSet à l'aide de JDBC pour Oracle prend beaucoup de temps, environ 16 secondes ?

J'ai mis en place une table avec 4000 lignes et 10 colonnes de 10 caractères chacune et fait un test de performance simple en utilisant l'approche suivante (RealTimeCounter est une classe qui mesure le temps réel entre start() et 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);

Résultats :

  • Taille de récupération par défaut :le temps d'exécution est d'env. 20 secondes
  • fetch size =100 :le temps d'exécution est d'environ 2,2 secondes
  • fetch size =500 :le temps d'exécution est d'environ 450 ms
  • fetch size =2000 :le temps d'exécution est d'environ 120 ms
  • fetch size =4000 :le temps d'exécution est d'environ 50 msec
  • fetch size =4001 :le temps d'exécution est d'environ 10 ms (!!)

Ainsi, la taille de récupération fait avoir un impact significatif sur la vitesse d'exécution.

Notez que, d'autre part, la taille de récupération a un impact sur la consommation de mémoire. Chose intéressante, une analyse rapide à l'aide de Runtime.getRuntime().freeMemory(); avant et après le code ci-dessus a montré que l'impact est bien moindre que ce à quoi je m'attendais, cependant. Les chiffres que j'ai obtenus sont :

  • Taille de récupération par défaut :665 Ko
  • taille de récupération = 100 : 665 k
  • taille de récupération = 500 : 665 k
  • taille de récupération =2 000 : 743 k
  • taille de récupération = 4 000 :821 k
  • taille de récupération = 4 001 : 861 k