2009-07-17 4 views
6

Z tym pytaniem, zadaje to wszystko: Jak efektywna jest metoda executeBatch? Czy istnieje benchmark wydajności, który mówi .. "jeśli masz 1000 rekordów do wstawienia, użycie executeBatch zamiast executeUpdate zapisuje x ilość cykli bazy danych?"Jak skuteczne jest executeBatch na Przygotowane oświadczenie?

A może to tylko konwencja?

EDYTOWANIE: Oto, nad czym pracuję: DB2 V 8.1 hostowany w Z/OS, aplikacji internetowej, która za jednym razem wstawia 80 000 rekordów w najgorszym przypadku.

+2

Zamiast dać wszystkim wełnianą liczbę, dlaczego nie spróbować samemu i zmierzyć? Tylko Ty możesz wiedzieć, jakie korzyści uzyskasz ze swojego ustawienia. – skaffman

+1

@skaffman Nie chcę robić czegoś, co popularnie nazywa się przedwczesną optymalizacją. Chciałbym jednak zrozumieć, jak znacznie jest on szybszy. – Jay

+0

Rozumiem to, ale nie można dokonać świadomego wyboru bez analizy porównawczej. – skaffman

Odpowiedz

8

Nie jesteś pewien, z której bazy danych korzystasz. Kiedy wpadłem na ten test przy użyciu programu DB2 jest to, co widziałem:

zapisu do bazy danych:

1 wkładka zajęło 2500 mikrosekund.

10 wkładek zajęło 6000 mikrosekund. (600 mikrosekund na zapis)

10000 wstawek zajęło około 1 miliona mikrosekund. (100 mikrosekund na zapis)

Osiągnięta wydajność. Wszystko to oznacza, że ​​w wysyłaniu wiadomości istnieje ogromny narzut, a użycie metody wsadowej minimalizuje to. Oczywiście wysyłanie insertów/aktualizacji w dużych partiach grozi utratą ich w przypadku awarii aplikacji.

Uwaga: Dokładne liczby będą się różnić w zależności od bazy danych i ustawień. Więc będziesz musiał znaleźć swój własny "słodki punkt". Ale to daje ci pomysł.

+0

@Windfinder użyłeś executeBatch dla wszystkich powyższych? Powiedziałeś też, że "ogromne partie są narażone na ryzyko zagubienia w przypadku awarii aplikacji" - jeśli korzystam z zarządzania transakcjami - powinienem być dobry w tym scenariuszu? – Jay

+0

Tak, użyłem executeBatch. Zarządzanie transakcjami nie całkowicie wyeliminuje to ryzyko, ale może je zmniejszyć. – Alex

+0

W najprostszy ze sposobów, jeśli miałbym ustawić autocommit na false i zatwierdzić tylko wtedy, gdy zwraca executeBatch, Jak jestem zagrożony? – Jay

1

Nie jestem pewien, o co pytasz, ale dla wstawienia wielu tysięcy wierszy, zestawienie o wartości bitowej jest znacznie szybsze. Nie mogę ci podać liczb.

+0

@skaffman to było moje pytanie - jak bardzo jest to szybsze? Czy możesz podać mi przybliżenie? – Jay

+0

Oceniłbym, że gdzieś pomiędzy 10 a 20 razy, to w dużym stopniu zależy od samej bazy danych. Niezaliczone zestawienie wiąże się z dużo większym ruchem w sieci, więc serwer usuwający może na przykład czerpać więcej korzyści z grupowania niż lokalny. – skaffman

+1

Ponad 10-20x według mojego doświadczenia (dla mojego konkretnego przypadku użycia). –

1

Z mojego doświadczenia wynika, że ​​jest znacznie szybsza - nawet jeśli wstawiasz/aktualizujesz tylko kilka rekordów na raz. Jeśli robisz więcej niż jedną aktualizację, prawie zawsze polecam grupowanie ich, jeśli ma to sens.

Powiedziawszy, trzeba wykonać pewne testy, aby dowiedzieć się poprawy wydajności w danej sytuacji.

0

specyfikacja JDBC Rozdział 14 mówi, że złożenie wielu SQL, zamiast indywidualnie, może znacznie poprawić wydajność

0

W batchExecute() sprawozdanie aktualizacyjne biorą więcej czasu, a następnie włóż oświadczenia jestem tring z 5001 wkładką i aktualizacji oświadczenia racja wykonania to 15:84

+0

A gdzie jest odpowiedź? – Rizier123