2011-07-01 11 views
5

Moja aplikacja C# .NET zapisuje miliony rekordów w tabeli tymczasowej za pomocą OracleBulkCopy. Za każdym razem, gdy aplikacja ma 20000 rekordów lub więcej w pamięci, wywołuje OracleBulkCopy, aby zapisać je wszystkie w jednej partii (używam rozmiaru wsadu = 0). Na początku tabela jest pusta, a napisanie całej partii zajmuje tylko 2 sekundy. W trakcie procesu wydłuża się czas pisania partii. Po 2.000.000 rekordów każde połączenie trwa prawie 25 sekund. Używam domyślnych opcji OracleBulkCopy. Wykonanie niektórych testów, gdy stół osiągnie 40 000 000, zajmuje prawie 3 minuty, aby zapisać 20 000 rekordów.OracleBulkCopy Performance

Chciałbym wiedzieć, czy istnieje jakieś zalecenie (nie mogłem nic na ten temat znaleźć), aby utrzymać prawie stały czas każdego połączenia. Czy robię coś złego?

+0

Czy masz jakieś wyzwalacze wstawiania w tym stole? – Nate

+1

Nie, nic. Nawet klucz podstawowy. A tabela jest ustawiona na brak logowania. –

+0

Co dokładnie oznacza tabela "temp"? Globalny tabela tymczasowa? – DCookie

Odpowiedz

3

Wydaje się dziwne zachowanie. Czy śledziłeś sesję bazy danych, wykonując wstawki, aby zobaczyć, na co czeka?

ALTER SESSION SET timed_statistics=TRUE; 
ALTER SESSION SET max_dump_file_size=UNLIMITED; 
ALTER SESSION SET EVENTS '10046 trace name context forever, level 8'; 

99 razy na 100 wyników śledzenia będzie wskazywać na problem w tych dziwnych przypadkach spowolnienia.

+1

Problem był kluczem podstawowym. Byłem pewien, że tabela została utworzona bez klucza podstawowego. Za pomocą pliku śledzenia zaobserwowaliśmy tysiące kolejnych odczytów na kluczu podstawowym. Usunięcie spowodowało prawie stały czas 0,8 sekundy na partię. –

+0

Cieszę się, że znalazłeś to i SQL Trace znaleziono kolejny problem. Jeśli wszystko pójdzie powoli, SQL Trace zawsze powinien być pierwszą rzeczą, której należy spróbować. –