Będę miał bazę danych SQL Server 2012 i tabelę z 3 milionami wierszy i może 50 kolumnami. Jaki będzie najszybszy sposób dla bezobsługowego procesu .net w tle (być może wydaje polecenie SQL lub Powershell) w celu wyeksportowania go do pliku tekstowego, jeden wiersz dla każdego wiersza danych? Proces .net powinien wiedzieć, kiedy eksport został zakończony lub czy wystąpił błąd. Typem danych będzie cały int
lub nvarchar
.
Zakładam, że czysty kod C # przy użyciu select *
polecenia ado.net do wykonania polecenia i zapętlania się w centrum danych i zapisywania do pliku dla każdego rekordu będzie powolny i nie ma możliwości, żebym mógł to zrównoleglić.
Najlepiej byłoby, gdyby eksport był do zdalnego udostępnionego folderu sieciowego, a nie lokalnego folderu na komputerze z programem SQL Server. SQL Server będzie klastrem HA. Czy SSIS lepiej nadaje się do tego, czy nie jest wymagana transformacja danych?
Proces .Net działałby na komputerze A, SQL Server na komputerze B, a docelowym miejscem docelowym plików był udział sieciowy. Jedną z opcji jest SQL Server zapisuje plik bezpośrednio do udziału sieciowego. Inną opcją jest zapis programu SQL Server na komputerze A, a następnie podczas zapisywania pliku proces .net kopiuje go do udziału sieciowego. Nie mam formalnej umowy SLA, ale oczekuję 30 minut - 1 godzina na zapis pliku.
źródło
"Ideally the export will be to a remote shared network folder and not a local folder on the SQL Server machine."
- skąd będzie działać aplikacja .NET? W najgorszym przypadku może to oznaczać, że dane muszą przechodzić przez 2 przeskoki sieciowe, co prawdopodobnie będzie największym wąskim gardłem. Ponadto liczba wierszy jest nieco nieistotna - jaki jest przybliżony całkowity rozmiar danych? Czy masz umowę SLA dotyczącą wydajności, którą musisz spełnić w tym procesie?Odpowiedzi:
Pętlowanie wszystkich tych artykułów jest opcją, jeśli chcesz się zestarzeć oglądając, jak się wykonuje.
Niektóre różne opcje, które powinieneś wypróbować:
Możesz wypróbować wszystkie te opcje podczas zapętlania w innej sesji, dla zabawy :-).
źródło
Chciałbym po prostu użyć Kreatora importu eksportu. Na koniec masz opcję zapisania zadania, które możesz następnie zaplanować za pomocą SQL Server Agent. Dodaj siebie jako operatora i skonfiguruj DB Mail na serwerze, który może wysłać Ci wiadomość e-mail, gdy zadanie zakończy się lub zakończy się niepowodzeniem.
Poważnie, po co wymyślać koło ponownie?
http://msdn.microsoft.com/en-us/library/ms140052.aspx
źródło
Inni stwierdzili, że bcp powinien być najszybszym sposobem, ale nie widzę żadnej przewagi nad rozwiązaniem CLR. W przypadku wstawek do tabel bazy danych różne implementacje kopiowania zbiorczego zawsze wygrywają. Wynika to przede wszystkim ze sposobu, w jaki minimalizują rejestrowanie i umożliwiają wielowątkowe zapisy. Nie masz tych ograniczeń podczas zapisywania do płaskiego pliku.
W mojej pracy używamy CLR, aby zrzucić dane wyjściowe zapytania do pliku. Mamy również włączenie Ionic.Zip.dll tak, że plik może być automatycznie spakowane po stworzeniu.
Oto przykład, który operacja twierdzi, że jest dwa razy szybszy niż bcp na obiektach blob: /programming/10325338/fastest-way-to-export-blobs-from-table-into-indidual-files
źródło
Możesz utworzyć prosty pakiet SSIS:
Oto ogólny poziom:
Każdy Noob powinien być w stanie to zrozumieć. Osoba z interfejsem GUI nie polubiłaby tego rozwiązania, więc zapisz uwagi na ten temat, jest to po prostu alternatywa dla mniej doświadczonych osób, które mają problemy z używaniem BCP ...
Masz nieco większą elastyczność w formatowaniu pliku danych. Możesz to zrobić w BCP i tak dalej, ale to eliminuje złożoność. Istnieje jednak niewielka zaleta, ponieważ można umieścić niestandardowy nagłówek pliku i utworzyć „Nazwę kolumny” jako pierwszy wiersz, co sprawia, że płaski plik jest bardziej użyteczny dla człowieka.
Nie zapomnij go zapisać, jeśli utworzyłeś go raz, prawdopodobnie zostaniesz o to ponownie zapytany! Mam nadzieję że to pomoże..
źródło
Myślę, że bcp.exe z wiersza poleceń powinien być najszybszym sposobem.
http://msdn.microsoft.com/en-us/library/ms162802.aspx
źródło