2013-07-19 4 views
14
while(result_set.next()) 
{ 
    ... 
} 

Mam użyć i obliczyć czas, dla każdej iteracji czas jest zajęty w milisekundach, ale ogólna pętla trwa około 16s. Rozważam możliwy powód, dla którego test warunków zajmuje dużo czasu, funkcja next().Iterowanie zestawu wyników przy użyciu JDBC dla Oracle zajmuje dużo czasu około 16 sekund?

FYI Łączę się ze zdalnym serwerem bazy danych, a kwerenda wyboru, którą wykonuję, jest wykonywana w milisekundach ponownie obliczona za pomocą wyżej wymienionej metody. Jakiekolwiek powody, dlaczego tak się dzieje i jak mogę przyspieszyć iterację zestawu wyników do maksymalnie sekundy?

EDIT:

mam do czynienia z około 4000 rekordów i każdy rekord contians około 10 kolumn każdy o wymiarach około 10 znaków

EDIT2 Dzięki setFetchsize() Czy magia, niesamowite, niesamowite

+1

Ile rekordów uważasz? –

+1

Ile rekordów zawiera zestaw wyników? Ponadto pomocne będzie zrozumienie, czy dostarczony jest cały kod pętli while. – Mubin

+0

Albo masz dużo rekordów, albo masz wolną sieć. Nie obwiniaj JDBC tutaj. – Kayaman

Odpowiedz

22

Spróbuj zmienić rozmiar pobierania ResultSet. Domyślnie sterownik JDBC Oracle odbiera zestaw wyników tylko 10 wierszy naraz od kursora bazy danych. Może to nie poprawić znacząco wydajności, ale nie ma zbyt wielu innych opcji, aby przyspieszyć działanie sterownika.

+1

'Nie sądzę, że to znacznie poprawi wydajność" - dobrze, to robi :-) zobacz moją odpowiedź poniżej. W każdym razie +1 za poprawną i dobrą odpowiedź –

+0

@Andreas fajne, +1, poprawiono moją odpowiedź –

28

mam skonfigurować tabelę z 4000 wierszy i 10 kolumn z 10 znaków każda i popełnił prosty test wydajności za pomocą następującego podejścia (RealTimeCounter to klasa, która mierzy w czasie rzeczywistym pomiędzy start() i 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); 

Wyniki:

  • domyślne pobrać wymiary: czas realizacji ok. 20 s
  • pobierania rozmiar = 100: Czas wykonania wynosi około 2,2 s
  • pobierania rozmiar = 500: wykonanie ok 450 ms
  • pobierania wielkość = 2000: Czas wykonania wynosi około 120 ms
  • pobierania wielkość = 4000: czas wykonania wynosi około 50 ms
  • pobierania wielkość = 4001: czas wykonania wynosi około 10 ms (!!)

Tak więc sprowadzić rozmiaru robi mieć znaczący wpływ na szybkość wykonania.


Należy pamiętać, że z drugiej strony rozmiar pobierania ma pewien wpływ na zużycie pamięci. Co ciekawe, szybka analiza przy użyciu przed i po powyższym kodzie wykazała, że ​​wpływ jest znacznie mniejszy, niż się spodziewałem.Liczb, dostał się:

  • domyślna pobierania rozmiar 665k
  • pobierania rozmiar = 100: 665k
  • pobierania rozmiar = 500: 665k
  • pobierania wielkość = 2000: 743k
  • pobierania rozmiar = 4000: 821k
  • Pobierz rozmiar = 4001: 861k
+2

świetna analiza – hershey92

+0

Warto wspomnieć, że zwiększanie wielkości pobierania często poprawia szybkość wykonywania, ale także powoduje, że program zużywa więcej pamięci - w końcu robisz kompromis. Żadnych darmowych lunchów tutaj. –

+0

@JohnRoberts dobry punkt - co ciekawe, szybka i brudna analiza zużycia pamięci pokazała, że ​​wpływ jest znacznie mniejszy niż się spodziewałem, choć ... –