2012-02-02 17 views
8

Widzę znaczne różnice wydajności między OracleBulkCopy (ODP.NET) i SQL * Loader, gdy serwer Oracle znajduje się na innym komputerze.OracleBulkCopy vs SQL * Wydajność programu ładującego

Mam bardzo podstawową tabelę w Oracle z trzema kolumnami (jeden BINARY_FLOAT, dwa NUMBER (18,0)). Nie ma kluczy podstawowych, indeksów, wyzwalaczy itp. Jest on używany jako tabela pomostowa, aby uzyskać zbiorcze dane do bazy danych.

SQL * ładowanie zajmuje około 27 sekund, aby załadować 4.5 miliona wierszy do tabeli.

OracleBulkCopy zajmuje około 10 minut, aby załadować tylko 1 milion wierszy.

OracleBulkCopy, zgodnie z dokumentacją, * "... stosuje podejście bezpośredniego obciążenia ścieżką, które jest podobne do, ale nie takie samo, jak Oracle SQL * Loader." * Może nie być tam z programem SQL * Loader pod względem wydajności, ale ta różnica jest absurdalna.

Po kilku podstawowych analizach ruchu sieciowego, stwierdziłem, że OracleBulkCopy wysyła i otrzymuje ogromną liczbę małych pakietów. Użyłem Wiresharka do porównania pakietów dla każdego i znalazłem kilka interesujących wyników.

SQL * ładowarki - po wstępnym uzgadniania połączenia - wysyła serię 8 kilobajtowego pakietów protokołów (TNS) i otrzymuje 60 bajtów ACK w reakcji.

OracleBulkCopy przesyła szereg 102 bajtów pakietów protokołów (TNS) i otrzymuje 133 bajtów pakiet (host TNS) w reakcji. Co...!? To tak jakby wysyłać jeden wiersz na raz!

Korzystając z klasy OracleBulkCopy, używam partii o wielkości 100 000 i używam niestandardowego identyfikatora IDataReader do odczytu z pliku danych.

Więc moje pytania to:

  • Czy ktoś kiedykolwiek widział ten problem?

  • Czy OracleBulkCopy faktycznie działa jako narzędzie do ładowania zbiorczego?

  • Czy jest coś, co muszę skonfigurować, aby działało poprawnie? (ustawienia klienta/serwera, itp.)

Każda pomoc jest doceniana.

+0

Mam podobne czasy wstawiania przy użyciu datatable. Co gorsza, kilka kolumn jest typu znacznik czasu, więc muszę ustawić kolumnę danych na typ OracleTimeStamp, który również wydaje się mieć dobre trafienie podczas profilowania aplikacji. Czy udało ci się przyspieszyć proces zbiorczy? Wyskakiwanie do linii poleceń, aby uruchomić program sqlloader, wydaje się być naprawdę kiepskim sposobem na obsługę dużych plików na serwerze WWW! – Dan

Odpowiedz

4

Otrzymałem odpowiedź od Alexa Keha, menedżera produktu Oracle, że Oracle "również zauważył ten problem." "Oceniamy, jak rozwiązać ten problem."

Więc w odpowiedzi na moje własne pytania, chyba OracleBulkCopy ma nie działa również jako narzędzie do ładowania zbiorczego. Przynajmniej nie w tej chwili.

Będę owijał SQL * Loader jako alternatywne rozwiązanie, ponieważ nie ma ETA na naprawieniu błędu.

+0

Z ciekawości sprobowałeś [powiązanie tablicy] (http://docs.oracle.com/html/B10961_01/features.htm #1025579)? –

+0

Tak, używamy wiązania tablicowego do większości naszych ładowań danych. W tym konkretnym przypadku ładujemy dziesiątki milionów wierszy danych do bazy danych i nie potrzebujemy dużej logiki - tylko szybkie ładowanie i powiązanie tablicy nie jest wystarczająco szybkie. –

+0

@AdrianBrown - Jeśli nadal monitorujesz ten wątek, czy pamiętasz, która wersja i czy były jakieś aktualizacje poprawki? – Leigh

1

Czy ten problem występuje również podczas korzystania z DataTable jako źródła? Czy jest to spowodowane wyłącznie użyciem IDataReader?

+0

Dobre pytanie. Tak, spróbowałem również użyć DataTable. Myślałem, że to może mieć coś wspólnego z transmisją IDataReadera, ale mam dokładnie to samo zachowanie. Po prostu zużywało więcej pamięci. :) –