Sugeruję odczytywanie danych porcjami:
Zamiast ładować całą tabelę, spróbuj podzielić dane na porcje i zaimportować je do SQL Server. Od jakiegoś czasu odpowiadałem na podobną odpowiedź związaną z SQLite, postaram się ją odtworzyć, aby pasowała do składni Oracle:
Przewodnik krok po kroku
W tym przykładzie każdy fragment zawiera 10000 wierszy.
- Zadeklaruj 2 zmienne typu
Int32
(@[User::RowCount]
i@[User::IncrementValue]
) - Dodaj
Execute SQL Task
które wykonująselect Count(*)
i zapisz zestaw wyników w zmiennej@[User::RowCount]
- Dodaj pętlę For z następującymi preferencjami:
- Wewnątrz kontenera pętli for dodaj
Data flow task
- Wewnątrz zadania przepływu danych dodaj
ODBC Source
iOLEDB Destination
- W źródle ODBC wybierz
SQL Command
i napiszSELECT * FROM TABLE
zapytanie *(aby pobrać tylko metadane` - Zmapuj kolumny między źródłem a miejscem docelowym
- Wróć do
Control flow
i kliknijData flow task
i naciśnij F4 aby wyświetlić okno właściwości -
W oknie właściwości przejdź do wyrażenia i przypisz następujące wyrażenie do
[ODBC Source].[SQLCommand]
właściwość:(Aby uzyskać więcej informacji, zobacz Jak przekazać zmienne SSIS w wyrażeniu ODBC SQLCommand?)"SELECT * FROM MYTABLE ORDER BY ID_COLUMN OFFSET " + (DT_WSTR,50)@[User::IncrementValue] + "FETCH NEXT 10000 ROWS ONLY;"
Gdzie MYTABLE
to nazwa tabeli źródłowej, a IDCOLUMN
to Twój klucz podstawowy lub kolumna tożsamości.
Zrzut ekranu przepływu sterowania
Referencje
- Źródło ODBC — serwer SQL
- Jak przekazać zmienne SSIS w wyrażeniu ODBC SQLCommand?
- JAK UŻYWAĆ ŹRÓDŁA ODBC SSIS I RÓŻNICY MIĘDZY OLE DB I ODBC?
- Jak mogę ograniczyć liczbę wierszy zwracanych przez zapytanie Oracle po złożeniu zamówienia?
- Pobieranie od n do n wierszy z bazy danych db2
Aktualizacja 1 — Inne możliwe obejścia
Podczas wyszukiwania podobnych problemów znalazłem kilka dodatkowych obejść, które możesz wypróbować:
(1) Zmień maksymalną pamięć SQL Server
-
SSIS:Menedżer buforów nie powiódł się podczas wywołania alokacji pamięci
sp_configure 'show advanced options', 1; GO RECONFIGURE; GO sp_configure 'max server memory', 4096; GO RECONFIGURE; GO
(2) Włącz potoki nazwane
-
[Naprawiono] Menedżer buforów wykrył, że system ma mało pamięci wirtualnej, ale nie był w stanie wymienić żadnych buforów
- Przejdź do Panelu sterowania -> Narzędzia administracyjne -> Zarządzanie komputerem
- On Protocol for SQL Instance -> Set Named Pipes =
Enabled
- Uruchom ponownie usługę instancji SQL
- Następnie spróbuj zaimportować dane, a teraz pobierze je porcjami, zamiast pobierać wszystkie naraz. Mam nadzieję, że to zadziała i zaoszczędzi Twój czas.
(3) Jeśli używasz SQL Server 2008, zainstaluj poprawki
- Proces środowiska wykonawczego SSIS 2008 ulega awarii po uruchomieniu pakietu SSIS 2008 w warunkach małej ilości pamięci
Aktualizacja 2 — Zrozumienie błędu
W poniższym łączu MSDN przyczyna błędu została opisana w następujący sposób:
Pamięć wirtualna to nadzbiór pamięci fizycznej. Procesy w systemie Windows zazwyczaj nie określają, którego mają używać, ponieważ (znacznie) uniemożliwiłoby to wielozadaniowość systemu Windows. SSIS przydziela pamięć wirtualną. Jeśli system Windows jest w stanie to zrobić, wszystkie te alokacje są przechowywane w pamięci fizycznej, gdzie dostęp jest szybszy. Jeśli jednak usługa SSIS zażąda więcej pamięci niż jest fizycznie dostępna, pamięć wirtualna rozlewa się na dysk, co powoduje, że pakiet działa wolniej o rzędy wielkości. A w najgorszych przypadkach, jeśli w systemie nie ma wystarczającej ilości pamięci wirtualnej, pakiet ulegnie awarii.