Pytanie:
Mam skrypt z około 45 tysiącami wstawek z wybranych instrukcji. Podczas próby uruchomienia pojawia się komunikat o błędzie informujący, że zabrakło mi pamięci. Jak mogę uruchomić ten skrypt?
Kontekst:
- Dodano nowe pola danych, aby aplikacja działała przyjemnie z inną aplikacją, z której korzysta klient.
- Dostałem arkusz kalkulacyjny danych od klienta pełnego danych, który zamapował bieżące elementy danych na wartości dla tych nowych pól.
- Konwertowany arkusz kalkulacyjny do wstawiania instrukcji.
- Jeśli uruchomię tylko niektóre instrukcje, działa, ale nie działa cały skrypt.
- Nie. Nie ma literówek.
Jeśli istnieje inny sposób, powinienem ładować te dane, możesz mnie ukarać i dać mi znać.
sql-server
sql-server-2005
etl
spaghetticowboy
źródło
źródło
Odpowiedzi:
Maksymalny rozmiar partii dla SQL Server 2005 wynosi 65 536 * Rozmiar pakietu sieciowego (NPS), gdzie NPS to zwykle 4KB. To działa do 256 MB. Oznaczałoby to, że każda instrukcja wstawiania miałaby średnio 5,8 KB. To nie wydaje się właściwe, ale może są tam obce przestrzenie lub coś niezwykłego.
Moją pierwszą sugestią byłoby umieszczenie instrukcji „GO” po każdej instrukcji INSERT. Spowoduje to rozbicie pojedynczej partii 45 000 instrukcji INSERT na 45 000 oddzielnych partii. Powinno to być łatwiejsze do strawienia. Bądź ostrożny, jeśli jedna z tych wkładek zawiedzie, możesz mieć trudności ze znalezieniem winowajcy. Możesz się zabezpieczyć przed transakcją. Możesz szybko dodać te instrukcje, jeśli twój edytor ma dobre wyszukiwanie i zamianę (co pozwoli ci wyszukiwać i zamieniać znaki powrotu, takie jak \ r \ n) lub funkcję makr.
Drugą sugestią jest użycie Kreatora do importowania danych bezpośrednio z Excela. Kreator buduje dla ciebie mały pakiet SSIS, a następnie uruchamia go. Nie będzie miał tego problemu.
źródło
GO
Po każdym stwierdzeniem? Myślę, że jeśli generujesz je przy użyciu innego skryptu, to jest OK. W przeciwnym razie po prostu wstawiałbym jeden po każdych 1000INSERT
s. Jeśli chodzi o tworzenie transakcji atomowych i minimalizowanie wielkości transakcji, dlaczego nie załadować wszystkich wierszy do tabeli tymczasowej lub zmiennej tabeli, a następnie załadować je jednym strzałem stamtąd do tabeli docelowej?BULK INSERT
lubbcp
wydają się bardziej odpowiednie opcje niż 45 000 instrukcji wstawiania.Jeśli chcesz trzymać się instrukcji wstawiania, rozważę kilka opcji:
Odp .: Użyj transakcji i zawiń partie po 100 lub 500 lub 1000 wyciągów w każdym, aby zminimalizować wpływ na dziennik i partię. na przykład
B: Zamiast pojedynczych instrukcji wstawiania używaj jednocześnie
UNION ALL
100 lub 500 instrukcji, npZostawiłem błąd dotyczący zwięzłości, ale chodzi o to, że nigdy nie próbowałbym wysłać pojedynczej partii 45 000 pojedynczych instrukcji do SQL Server.
źródło
VARCHAR(800)
kolumn na 2008 z kompilacji czasie 12,5 minuty na moim 2008 przykład dev jak to robi wiele niepotrzebnych wartości pracy porównując zamiast po prostu wsiąść z włożeniem (sprawuje się dużo szybciej po sparametryzowaniu i bez wartości do obejrzenia). Chociaż znacznie poprawiony w 2012 roku, nieliniowy wzór nadal istnieje i powinien zostać naprawiony w wersji później.Nie jestem pewien, dlaczego występuje błąd braku pamięci, ale istnieje łatwiejsze podejście.
Jeśli możesz wyeksportować dane z arkusza kalkulacyjnego do formatu rozdzielanego (np. Csv), możesz użyć kreatora importu danych w SSMS, aby wstawić dane:
źródło
Używając wielu SqlBulkCopy, utwórz tabelę tymczasową. Wstaw nowe dane do tabeli tymczasowej, a następnie scal dane z tabeli tymczasowej z istniejącą. Przykład z wykorzystaniem metody C # SqlBulkCopy.WriteToServer (DataTable) . Mam nadzieję, że to pomoże
źródło
Tak, moglibyśmy to zrobić, próbowałem z podejściem BCP (Bulk Copy Program), aby uniknąć problemu z OutOfMemory .
Uwaga : Wypróbowano na SQL Server 2014.
W BCP najpierw musimy wyeksportować dane źródłowej bazy danych do pliku bcp (w folderze katalogu lokalnego), a następnie zaimportować ten plik bcp do docelowej bazy danych.
Poniżej znajdują się kroki chodzenia po torcie:
Uwaga:
a) Upewnij się, że pusta tabela jest obecna w docelowej bazie danych
b) Upewnij się, że folder Temp znajduje się na dysku C.
Utwórz plik nietoperza o nazwie Export_Data.bat za pomocą polecenia pokazanego poniżej:
pauza
Uruchom ten plik nietoperza, w wyniku czego plik bcp zostanie wygenerowany w folderze Temp
Następnie utwórz kolejny plik nietoperza o nazwie Import_Data.bat za pomocą następującego polecenia:
Pauza
I zaczynamy!
źródło