Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Iterar um ResultSet usando o JDBC para Oracle leva muito tempo, cerca de 16s?


Configurei uma tabela com 4000 linhas e 10 colunas com 10 caracteres cada e fiz um teste de desempenho simples usando a seguinte abordagem (RealTimeCounter é uma classe que mede o tempo real entre start() e 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:
  • Tamanho de busca padrão:o tempo de execução é de aprox. 20 segundos
  • fetch size =100:o tempo de execução é de aproximadamente 2,2 segundos
  • fetch size =500:o tempo de execução é de aproximadamente 450 ms
  • fetch size =2000:o tempo de execução é de aproximadamente 120 ms
  • fetch size =4000:o tempo de execução é de aproximadamente 50 ms
  • fetch size =4001:o tempo de execução é de aproximadamente 10 ms (!!)

Portanto, o tamanho da busca não têm um impacto significativo na velocidade de execução.

Observe que, por outro lado, o tamanho da busca tem algum impacto no consumo de memória. Curiosamente, uma análise rápida usando Runtime.getRuntime().freeMemory(); antes e depois do código acima mostrou que o impacto é muito menor do que eu esperaria. Os números que consegui são:
  • Tamanho de busca padrão:665k
  • tamanho da busca =100:665k
  • tamanho da busca =500:665k
  • tamanho da busca =2000:743k
  • tamanho da busca =4000:821k
  • tamanho da busca =4001:861k