Jaki jest najszybszy sposób na eksport tabeli do pliku tekstowego

17

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 intlub 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.

softveda
źródło
3
"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?
Jon Seigel

Odpowiedzi:

10

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 :-).

Marian
źródło
4

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

Kawałki bekonu
źródło
Nieźle, w rzeczywistości oszczędza to pakiet SSIS na końcu. Jeśli jest to jednorazowe zadanie, może być rozwiązaniem.
Marian
2

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

Brian
źródło
To szczególne pytanie nie jest zbyt szczegółowe. Sugeruję przeczytanie następującego pytania - Optymalizacja wydajności BCP dla danych BLOB tutaj. Z pewnością da wyobrażenie o wielu opcjach gry dostępnych tylko w BCP :-).
Marian
Widzę linki i całkowicie się zgadzam. Ale większość punktów optymalizacji służy do ładowania danych na serwer SQL. Nie widziałem jeszcze żadnych faktów związanych z bcp, które byłyby szybsze niż streamwriter lub rozwiązanie CLR strumienia plików podczas zapisywania danych SQL do pliku płaskiego.
brian
1

Możesz utworzyć prosty pakiet SSIS:

Oto ogólny poziom:

  1. Utwórz połączenie OLEDB z bazą danych w menedżerze połączeń
  2. Przeciągnij transformację przepływu danych do przepływu sterowania, a następnie kliknij go, aby przejść do przepływu danych.
  3. Przeciągnij źródło OLEDB z przybornika do przepływu danych i edytuj je, aby łączyło się z wybraną tabelą za pomocą połączenia utworzonego w kroku 1
  4. Przeciągnij płaskie miejsce docelowe pliku z przybornika do przepływu danych i podłącz do niego źródło OLEDB.
  5. Wybierz „Nowy” w Płaskim miejscu docelowym pliku, a utworzy nowy płaski plik o tej samej strukturze kolumn, i możesz użyć żądanego separatora, a może stałej z plikiem, jeśli chcesz.
  6. Uruchom.

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..

Szef kuchni Slagle
źródło
0

Myślę, że bcp.exe z wiersza poleceń powinien być najszybszym sposobem.

http://msdn.microsoft.com/en-us/library/ms162802.aspx

bummi
źródło
5
Czy masz rację, czy możesz rzucić nieco światła na szczegóły dotyczące tego rozwiązania? Jak jest używany (może wystarczyć link do dokumentacji), dlaczego uważasz, że jest szybszy itp.
dezso