7

Mam aplikację Lazur w chmurze z bazą danych SQL Azure. Mam rolę roboczą, która musi wykonać przetwarzanie + przetwarzania w pliku (do ~ 30 milionów wierszy), więc nie mogę bezpośrednio używać BCP lub SSIS.Równoległe wstawianie zbiorcze za pomocą SqlBulkCopy i Azure

Obecnie używam SqlBulkCopy, jednak wydaje mi się to zbyt wolne, ponieważ widziałem czasy ładowania do 4-5 minut dla 400k wierszy.

Chcę uruchomić moje wkładki luzem równolegle; jednak czytając artykuły o importowaniu danych w sposób równoległy/kontrolujący zachowanie blokady, mówi, że SqlBulkCopy wymaga, aby tabela nie zawierała indeksów klastrowych i trzeba określić tablelock (blokada BU). Jednak tabele azure musi mieć indeks klastrowany ...

Czy jest możliwe nawet równoległe użycie SqlBulkCopy w tej samej tabeli w SQL Azure? Jeśli nie, to jest inny API (który mogę użyć w kodzie), aby to zrobić?

Odpowiedz

4

Nie widzę sposobu, w jaki można uruchomić szybciej niż przy użyciu SqlBulkCopy. W naszym projekcie możemy zaimportować 250K wierszy w około 3 minuty, więc twoja stawka wydaje się być w porządku.

Nie sądzę, że robienie tego równolegle pomogłoby, nawet gdyby było to technicznie możliwe. W tym samym czasie uruchamiamy tylko jeden import, w przeciwnym razie SQL Azure rozpocznie odliczanie naszych żądań.

W rzeczywistości czasami uruchomienie dużej grupy zapytań w tym samym czasie, co importowanie, nie jest możliwe. SQL Azure robi dużo pracy, aby zapewnić jakość usług, obejmuje odmierzanie żądania trwa zbyt długo, zbyt wiele zasobów, itd

Więc robi kilka dużych insertów luzem w tym samym czasie będzie prawdopodobnie przyczynę jeden do koniec czasu.

+1

Ass Matt mówi. Przepustowość wydaje mi się właściwa. Upewnij się, że nie ma indeksów w tabelach poza indeksem klastrowym. –

+4

Skończyło się na jednoczesnym wstawianiu do tabel tymczasowych, a następnie robieniu wstawiania z tych tabel tymczasowych do tabel głównych (w trybie szeregowym). Wydawało mi się to znacznie szybsze, ponieważ wstawienie z tymczasowych stołów zajęło około 4-5 minut na około 2 miliony rzędów. – kyliod

1

Możliwe jest uruchomienie SQLBulkCopy równolegle z SQL Azure, nawet jeśli załadujesz tę samą tabelę. Zanim prześlesz je do API SQLBulkCopy, musisz przygotować swoje zapisy w partiach. To absolutnie pomoże w osiągach, i pozwala kontrolować operacje powtórkowe dla mniejszej partii rekordów, gdy zostaniesz zdławiony z przyczyn niezależnych od ciebie.

Spójrz na mój blog post, porównując czasy ładowania różnych podejść. Istnieje również przykładowy kod. W oddzielnych testach udało mi się skrócić czas ładowania stołu o połowę.

Jest to technika, której używam dla kilku narzędzi (Enzo Backup, Enzo Data Copy); Nie jest to proste, ale jeśli zrobisz to poprawnie, możesz znacznie zoptymalizować czas ładowania.