sql >> Base de Datos >  >> RDS >> Oracle

¿Iterar un ResultSet usando JDBC para Oracle toma mucho tiempo alrededor de 16 segundos?

Configuré una tabla con 4000 filas y 10 columnas con 10 caracteres cada una e hice una prueba de rendimiento simple usando el siguiente enfoque (RealTimeCounter es una clase que mide el tiempo real entre start() y 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);

Resultados:

  • Tamaño de recuperación predeterminado:el tiempo de ejecución es de aprox. 20 segundos
  • tamaño de búsqueda =100:el tiempo de ejecución es de aproximadamente 2,2 segundos
  • tamaño de recuperación =500:el tiempo de ejecución es de aproximadamente 450 ms
  • tamaño de recuperación =2000:el tiempo de ejecución es de aproximadamente 120 ms
  • tamaño de búsqueda =4000:el tiempo de ejecución es de aproximadamente 50 ms
  • tamaño de recuperación =4001:el tiempo de ejecución es de aproximadamente 10 ms (!!)

Entonces, el tamaño de recuperación tienen un impacto significativo en la velocidad de ejecución.

Tenga en cuenta que, por otro lado, el tamaño de recuperación tiene cierto impacto en el consumo de memoria. Curiosamente, un análisis rápido usando Runtime.getRuntime().freeMemory(); Sin embargo, antes y después del código anterior se mostró que el impacto es mucho menor de lo que esperaría. Los números que obtuve son:

  • Tamaño de recuperación predeterminado:665k
  • tamaño de recuperación =100:665k
  • tamaño de recuperación =500:665k
  • tamaño de recuperación =2000:743k
  • tamaño de recuperación =4000:821k
  • tamaño de búsqueda =4001:861k